相信不少人都对JavaScript中的this指向问题只知其一;不知其二,因此今天就来详细看看它究竟是怎么判断的。
var length = 10; function fn() { console.log(this.length); } var obj = { length: 5, method: function(fn) { fn(); arguments[0](); } }; obj.method(fn, 1); // 10 2
var name = 'window'; function f1() { var name = 'f1'; return function f2() { var name = 'f2'; console.log(this.name); } } var foo = f1(); var bar = { name: 'bar', foo: foo }; foo(); // window bar.foo(); // bar
var name = 'window'; var bar = { name: 'bar', foo: function () { var self = this; console.log(this.name); console.log(self.name); (function () { console.log(this.name); console.log(self.name); })() } }; bar.foo(); // bar bar window bar
var name = 'window'; function f1() { var name = 'f1'; return () => { var name = 'f2'; console.log(this.name); } } var foo = f1(); var bar = { name: 'bar', foo: foo }; foo(); // window bar.foo(); // window
function foo() { console.log(this === window); } foo() // true function bar() { "use strict"; console.log(this === window); console.log(this); } bar() // false undefined
若是函数引用有上下文对象时,this将会绑定到这个对象。椎确来讲是函数调用时是否有引用上下文对象。app
var name = 'window'; function foo() { console.log(this.name); } var obj = { name: 'obj', foo: foo }; obj.foo(); // obj 隐式绑定,上下文对象obj var bar = obj.foo; bar(); // window 无上下文对象
这也是经常使用的的方式:call、apply、bind 就不一一举例了。函数
function foo() { console.log(this.name); } var obj = { name: 'obj' }; foo.call(obj) // obj
var a; function foo(a) { this.a = a } var bar = new foo(2); console.log(a); //undefined console.log(bar.a); // 2 this了bar
var a; function foo(a) { this.a = a; } var obj = { foo: foo }; var obj2 = {}; console.log(a); // undefined obj.foo(1); console.log(obj.a); // 1 obj.foo.call(obj2, 2); console.log(obj2.a); // 2 var baz = obj.foo.bind(obj2); var bar = new baz(3); console.log(bar.a); // 3
从上面的代码能够看出优先级从高到低依次是:new绑定、显示绑定、隐式绑定、默认绑定。this