函数中的隐式参数
在函数调用的时候,浏览器每次都会传递进两个隐式参数:
函数的上下文对象this
this对象是在运行时基于函数的执行环境绑定的:
- 在全局环境中,this等于window
- 当函数被作为某个对象的方法调用时,this等于那个对象。
- 匿名函数的执行环境具有全局性,因此其this对象通常指向window。
- 每个函数都有自己的执行环境。全局执行环境是最外围的一个执行环境。this指向的就是当前代码所在的执行环境。
// 定义一个全局变量
var type = "全局";
// 定义函数aa
function aa () {
var type = '局部';
console.log(this.type);
}
aa(); // "全局"
// 定义对象bb
var bb = {
type: '局部',
getType: function () {
console.log(this.type)
}
};
bb.getType(); // “局部”
// 定义对象cc
var cc = {
type: '局部',
getType: function () {
return function () {
return this.type
}
}
};
cc.getType(); // “全局”(非严格模式下)
- 第一个例子,aa函数运行在全局环境中,所以this指向window。
- 第二个例子,bb是一个对象,调用bb的getType方法,getType的运行环境在bb对象中,this指向bb。
- 第三个例子,同bb对象,不同的是cc的getType方法返回的是一个匿名函数,匿名函数中又返回this.type。为什么this并没有像bb中一样指向bb,这个和JS的活动对象有关。每个函数在被调用时,其活动对象都会自动取得两个特殊变量:this和arguments。内部函数在搜索这两个变量时,只会搜索其活动对象为止,活动对象为当前所在执行环境的变量对象,当前所在的执行环境是一个立即执行的匿名函数,变量对象里并没有this.type,所以this还是指向window。
封装实参的对象arguments
例子:
function fun(){
console.log(arguments);
}
fun('tom',[1,2,3],{name:'guixi'});
可以通过arguments来调用传递给函数fun的实参。
-
arguments还有属性callee,length和迭代器Symbol。
-
callee的值是函数fun,callee指向函数fun
function fun(){
// console.log(arguments);
console.log(arguments.callee === fun);
//true [callee指向函数fun]
}
fun('tom',[1,2,3],{name:'guixi'});
- 第二个属性length,我们经常在数组或者类数组中看到,
- arguments的原型索引__proto__的值为Object,arguments不是数组,而是一个类数组对象。
- 第三个属性是个Symbol类型的键,该类型的值都是独一无二的,该键指向的值是一个values函数,
该值是一个生成迭代器的函数,下面是ES6入门的部分文档。
关于Symbol.iterator
https://blog.csdn.net/margin_0px/article/details/82971545
let arr = ['a', 'b', 'c'];
let iter = arr[Symbol.iterator]();
iter.next() // { value: 'a', done: false }
iter.next() // { value: 'b', done: false }
iter.next() // { value: 'c', done: false }
iter.next() // { value: undefined, done: true }
//在arguments中有同样的效用。
function fun(){
console.log(arguments[Symbol.iterator]);
let iterator = arguments[Symbol.iterator]();
console.log('iterator:',iterator);
console.log(iterator.next());
console.log(iterator.next());
console.log(iterator.next());
console.log(iterator.next());
}
fun('tom',[1,2,3],{name:'guixi'});
打印结果: