在JavaScript中this
的值是在代码运行时计算出来的,它取决于代码上下文
函数内部的 “this” 是“点符号前面”的那个对象
如果 obj.f()
被调用了,则 this
在 f
函数调用期间是 obj
在没有对象的情况下调用:严格模式下this == undefined
在非严格模式的情况下,this
将会是 全局对象(浏览器中的 window
)
箭头函数有些特别:它们没有 this
。在箭头函数内部访问到的 this
都是从外部获取的
例1
var a = {
name: "里面的name",
sayName: function(){
console.log("this.name = " + this.name);
}
};
var name = "外面的name";
function sayName(){
var sss = a.sayName;
sss(); // this.name = ?
a.sayName(); // this.name = ?
(a.sayName)(); // this.name = ?
(b = a.sayName)(); // this.name = ?
}
sayName();
解析
sayName.call(null): this -> window
sss.call(null): this -> window, this.name === “外面的name”
a.sayName.call(a): this -> a, this.name = “里面的name”
(a.sayName).call(a): this -> a, this.name = “里面的name”
(b = a.sayName)() 等价于b.call(null): this -> window, this.name === “外面的name”
例2
var length = 10
function fn(){
console.log(this.length)
}
var obj = {
length: 5,
method: function(fn) {
fn();
arguments[0]();
}
}
obj.method(fn, 1) // 输出是什么?
解析
obj.method.call(obj, fn, 1)
arguments = [fn, 1]
fn.call(null): this -> window , this.length === 10
arguments0等价于arguments.fn.call(arguments), this.length === 2