1

看如下对象定义:

'use strict'
var jane = {
    name : ‘Jane’,
    display : function(){
        retrun 'Person named ' + this.name;
    }
};

这样能正常调用

jane.display();

下面的调用会出错:

var func = jane.display;
func()
TypeError: Cannot read property 'name' of undefined

因为,this指向已经改变,正确的方式如下:

var func2 = jane.display.bind(jane);
func2()
'Penson named Jane'

所有函数都有其特殊的this变量,如下面的forEach

var jane = {
    name : 'Jane',
    friends: ['Tarzan', 'Cheeta'],
    sayHiToFriends: function(){
        'use strict';
        this.friends.forEach(function(friend) {
            // 'this' is undefined here
            console.log(this.name + ' says hi to '+ friend);
        });
    }
}   

调用sayHiToFriends会产生一个错误:

jane.sayHiToFriends()
TypeError: Cannot read property 'name' of undefined

解决方案一:将this保存在不同的变量中

var jane = {
    name : 'Jane',
    friends: ['Tarzan', 'Cheeta'],
    sayHiToFriends: function(){
        'use strict';
        var that = this;
        this.friends.forEach(function(friend) {
            console.log(that.name + ' says hi to '+ friend);
        });
    }
}  

解决方案二:利用forEach的第二个参数,它可以给this指定一个值

var jane = {
    name : 'Jane',
    friends: ['Tarzan', 'Cheeta'],
    sayHiToFriends: function(){
        'use strict';
        this.friends.forEach(function(friend) {
            console.log(this.name + ' says hi to '+ friend);
        }, this);
    }
}  

zhoutk
2.6k 声望1.2k 粉丝

自由程序员,技术路线c,delphi,c++,c#,java,php,node.js,python,golang,typescript;超喜欢react.js的设计思路,全栈开发成为我的终极目标。开发机器macbook pro,或装ubuntu、fedora的机器,编程用vim...