this在不同场景的作用,如下例子
//1.函数预编译过程中 this --> window //AO this: window function test() { console.log(this) } test() //window
//2.全局作用域里 this --> window //GO this: window console.log(this) //window
//3.call/apply可以改变函数运行时this指向 var obj = {} function Person(name, age) { this.name = name this.age = age } Person.call(obj, 'lyj', 18) // Person.apply(obj, ['lyj', 18]) console.log(obj) //{name: "lyj", age: 18}
//4.obj.func(), func()里面的this指向obj var obj = { a: function() { console.log(this.name) }, name: 'abc' } obj.a() //abc
看以下例子
var name = '222' var a = { name: '111', say: function() { console.log(this.name) } } var fun = a.say fun() //222 没有被谁调用, this指向window a.say() //111 被a调用, this指向a var b = { name: '333', say: function(fun) { fun() //没有被谁调用, fun里面的this指向window } } b.say(a.say) //222 b.say = a.say b.say() //333 被b调用, this指向b
看很多面试中的题目
var foo = { baz: function() { console.log(this) } }; foo.baz(); // foo (foo.baz)(); // also foo (foo.baz = bar.baz)(); // 这是一个全局对象 (foo.baz, bar.baz)(); // 也是全局对象 (foo || bar.baz)(); // 也是全局对象 //解释一下:因为 = , || 都是赋值运算,而赋值语句的返回值就是赋值的值,所以后面三个转换后变成函数对象,即(function(){ console.log(this)})(), 而前面两个还是引用类型的function
end !!!