this
用自然语言的角度理解JavaScript中的this关键字:http://blog.leapoahead.com/2015/08/31/understanding-js-this-keyword/
使用Function.prototype.bind把function绑定到某个对象:
//每个函数都有一个bind方法:Function.prototype.bind
xiaoming.run = xiaoming.run.bind(xiaoming);
多次bind之后,this对象是第一次绑定的obj;
使用call和apply也是可以的;
call/apply 和 bind避免混用;
严格模式下,调用方法没有主语,this为undefined
没法看到定义的函数是被谁调用的:
window.val = 'window val'; var obj = { val: 'obj val', foo: function() { $('#text').bind('click', function() {
//this为$('#text') console.log(this.val); }); } }; obj.foo();
想要在上面的回调函数里面使用obj的val值,除了直接写obj.val之外,还可以在foo方法中用一个新的变量that来保存foo运行时this的值:
window.val = 'window val'; var obj = { val: 'obj val', foo: function() { var that = this; // 保存this的引用到that,这里的this实际上就是obj $('#text').bind('click', function() { console.log(that.val); // 输出:obj val }); } }; obj.foo();
另外一种方法就是为该匿名函数bind:
window.val = 'window val'; var obj = { val: 'obj val', foo: function() { $('#text').bind('click', function() { console.log(this.val); // 输出:obj val }.bind(this)); } }; obj.foo();