javascript中this
javascript中的this接触很多,但一直是模模糊糊的,在这里整理下
相关
与其他语言相比,函数的 this 关键字在JavaScript中的行为略有不同。它在严格模式和非严格模式之间也有一些区别。
读了廖雪峰老师的文章感觉文中所说的调用对象就是指执行环境,不知道可不可以这样理解
当一个函数被调用时,会创建一个 __执行环境(execution context)__及相应的作用域链,自动获取两个特殊变量:this和arguments,然后使用arguments和其他命名参数的值来初始化函数的 **活动对象(activation object)**,
(function(){}())立即执行函数
构造函数模式创建对象时,会经历以下4个步骤
- 创建一个新对象
- 见构造函数的作用域赋给新对象(因此this就指向了这个新对象)
- 执行构造函数中的代码(为这个对象添加属性)
- 返回新对象
this 指向
this总是指向调用函数的那个对象,在运行时基于函数的执行环境绑定的
纯函数调用
属于全局调用,this代表全局对象Global
function foo(){
console.log(this);
};
foo(); //Window
作为对象方法的调用
this指向调用的函数
作为构造函数调用
this 指向当前实例对象
apply && call
apply()和call()作为函数对象的方法,可以改变函数的执行环境(调用对象)
它们的第一个参数是个对象,即作为函数内的this。
function foo(){
console.log(this);
}
foo.call(1); //1
foo.call('a'); //a
foo.call(true); //true
foo.call({type:object}); //[object Object]
如上,他们的参数作为函数内的this输出
需要注意的是,传null或undefined时,将是JS执行环境的全局变量。浏览器中是window,其他环境,如node则是global。
fun.call(null); //window or global
fun.call(undefined); //window or global
apply()和call()唯一的区别是参数不一样,apply的第二个参数必须传入数组。
如
func1.call(this, arg1, arg2);
func1.apply(this, [arg1, arg2]);
适用条件
js中函数的参数不固定,当参数是明确知道数量时,用 call,而不确定的时候,用 apply,然后把参数 push 进数组传递进去。当参数数量不确定时,函数内部也可以通过 arguments 这个 __类数组__来便利所有的参数。
小小结
- apply() 的第一个参数是对象,第二个参数是数组,作为参数列表。
从ECMAScript规范谈this
上面说的this的指向很偏应用的,倒是像经验上的总结。具体还是要看规范的,这部分打算之后再好好写写