js中定义函数的方法.
function add(a,b){
return a + b;
}
如果没有return语句,函数执行好后也会返回执行结果,只是结果为undefined.
js中有一个免费赠送的关键字arguments,他只在函数内部起作用,永远指向传入的当前参数,arguments类似array但又不是array.
function add(a,b){
for(var i = 0; i < arguments.length;i++)
console.log('arg' + arguments[i]);
}
add(2,3);
js函数允许接收任意多个参数,es5提供了rest参数,可以获得除了标准传入的参数外其余的参数.
function add(a,b, ...rest){
console.log(rest);
}
add(2,3,4,5,6);
如果传入的参数没有填满,也没有关系,rest参数会接收一个空数组.
小心return语句,js引擎会在每个句子的行末加上;
function foo(){
return
2;
}
console.log(foo());
这种相当于 return undefined;
所以用return {2};
变量域与解构赋值.
var 申明的变量实际是有作用域的.
如果一个变量在函数体内部申明,则该变量的作用域为整个函数体,在函数体外不可引用该变量:
'use strict';
function foo() {
var x = 1;
x = x + 1;
}
x = x + 2; // ReferenceError! 无法在函数体外引用变量x
由于js函数可以进行嵌套,那么,内部函数可以访问外部函数定义的变量.反过来就不行.
function foo(){
var x = 1;
function bar(){
var y = x + 1;
console.log(y);
}
bar();
}
foo();
js函数有一个特点,会先扫描整个函数体的语句,把所有申明的变量提升到函数的顶部.
function foo(){
var x = 'hello' + y;
console.log(x);
var y = 'Bob';
}
x定义不会报错,但是 console.log(x)中y不会输出e全局的作用域:
不在任何函数内定义的变量具有全局作用域:实际上,js有一个默认的全局作用域window,全局属性被默认绑定到了window上.
,因此,顶层函数的定义也被视为一个全局变量,并绑定到window
对象
全局变量都会绑定到window上,不同的js文件如果定义了相同的全局变量,或者使用了相同的顶层函数,就会造成命名的冲突.
减少冲突的一个方法是把自己的所有变量和函数全部绑定到一个全局变量中。例如:
/ 唯一的全局变量MYAPP:
var MYAPP = {};
// 其他变量:
MYAPP.name = 'myapp';
MYAPP.version = 1.0;
// 其他函数:
MYAPP.foo = function () {
return 'foo';
};
从ES6开始,JavaScript引入了解构赋值,可以同时对一组变量进行赋值。
var arr = ['hello','nihao','haha'];
var [x,y,z] = arr;
若数组本身还有嵌套,也可以通过嵌套进行解构赋值,注意嵌套层位置要保持一致.
var [x,[y,z]] = ['hello',['java','c']];
使用场景,解构赋值在很多时候可以大大的简化代码,例如交换两个变量x和y
var x = 1,y = 2;
[x,y] = [y,x];
给对象可以绑定方法即函数.
var xiaoming = {
name:'小明',
birth:1990,
age:function() {
return birth;
}
}
指定到对象上的函数称为方法,和普通函数也没什么区别,但是它在内部定义了一个this关键字,始终指向当前的对象,也就是xiaoming这个变量.所以,this.birth可以拿到birth属性.当拆开写:
function getAge() {
var y = new Date().getFullYear();
return y - this.birth;
}
var xiaoming = {
name: '小明',
birth: 1990,
age: getAge
};
xiaoming.age(); // 25, 正常结果
getAge(); // NaN
单独调用的时候,就返回了NAN,
this指向的变量视情况而定,比如xiaoming.age(),该this指向被调用的对象,也就是xiaoming,如果进行单独的调用,比如getAge(),此时,函数的this指向全局对象,
也就是window.
var fn = xiaoming.age; // 先拿到xiaoming的age函数
fn(); /
这种情况也是不行的.要保证this指向正确,必须调用obj.xxx()这种.
var xiaoming = {
name:'小明',
birth:1990,
age:function() {
function getBIrth(){
return this.birth;
}
return getBIrth();
}
}
console.log(xiaoming.age());
这种情况下也是报错的. this只在age方法的函数内指向xiaoming,在函数内部定义的函数,又指向undefined了.
可以使用that先捕获this,随后再进行指向即可.
apply函数的用法.
虽然在一个独立的函数调用中,根据是否使用strict模式,this指向undefined或者window
要指定函数的this指向哪个对象,可以用函数本身的apply方法,接受两个参数,第一个是需要绑定的this变量,第二个是array,表示函数本身所需的参数.
function getAge(){
var y = new Date().getFullYear();
return y - this.birth;
};
var xiaoming = {
birth:111,
};
console.log(getAge.apply(xiaoming,[]));
与apply相似的便是call函数 apply把参数打包成array传入,call按参数顺序传入.
function getAge(a){
var y = new Date().getFullYear();
return y - this.birth + a;
};
var xiaoming = {
birth:111,
};
console.log(getAge.call(xiaoming,1));
apply和call的区别.
https://www.cnblogs.com/lengyuehuahun/p/5643625.html
块级作用域 用{}绑定起来 可以用let绑定,使{}外的不能够访问.
- var定义的变量,没有块的概念,可以跨块访问, 不能跨函数访问。
- let定义的变量,只能在块作用域里访问,不能跨块访问,也不能跨函数访问。
- const用来定义常量,使用时必须初始化(即必须赋值),只能在块作用域里访问,而且不能修改。详情
- https://blog.csdn.net/LKM_wonderful/article/details/70255713