Object方法中的“this”关键字指向Window

时间:2011-06-25 07:31:13

标签: javascript

var name = 'The Window';
var object = {  
  name: 'My Object',
  getNameFunc: function(){    
    return function() {     
      return this.name;   
    }; 
  }
};

console.log( object.getNameFunc()() );

当我测试代码时。结果是窗口。但我认为this.name;应为My Object。我的想法有什么问题。

当我在name : "My Object",之前添加var时显示错误。?为什么呢?

5 个答案:

答案 0 :(得分:3)

函数内的

this是它被调用的“接收者”。

即,

    对于构造x.f()
  1. ,函数(this)内的f将评估为x 的值。< / p>

  2. 对于所有其他情况,this将在调用的函数内评估为window(函数callapplybind也可以改变this ......但这是另一个故事。)

  3. 在发布的示例中,使用this.name表单调用了第二个函数(x.f() ,因此this是{{1}对象。

    “简单修复”是使用闭包:(第一个函数window形式调用,因此x.f()this相同我们通过使用object创建的闭包和返回的函数来捕获当前作用域中this的值。)

    self

    但是,我可能会考虑另一种设计,具体取决于:)

    快乐的编码。


    补充说明,征求意见:

    ...这是因为您使用的格式getNameFunc : function () { var self = this return function () { return self.name } } circle.getArea()。因此,getArea函数中的x.f()计算结果为this

    在发布的代码中,您连续调用两个不同的函数。想象一下编写这样的代码:

    circle

    第一个函数调用的形式为var nameFunc = object.getNameFunc() nameFunc() ,因此getNameFunc中的x.f()this的评估。但是,在第二行中,函数(nameFunc)是以object形式调用而不是。因此,x.f()内部的nameFunc(从getNameFunc返回的函数)将评估为this,如上所述。

答案 1 :(得分:2)

您需要使用.bind()为方法设置正确的上下文,因此this关键字将是您想要的实际关键字。 默认情况是this关键字指向window对象,因为......这就是JS引擎的工作方式。

var name = "The Window";
var object = {
  name : "My Object",
  getNameFunc : function(){
    return function(){
      return this.name;
    }.bind(this); // <-- sets the context of "this" to "object"
  }
};
console.log( object.getNameFunc()() );

答案 2 :(得分:2)

var myObject = {
    name:'My Object'
};

console.log(myObject.name);
console.log(myObject['name']);

还有其他各种方法可以在javascript中创建对象。

this是一个隐藏的参数,它自动从调用函数传递给被调用者。传统的做法是:

function MyObject() {
    this.name = 'My Object';
}
myObject = new MyObject();

console.log(myObject.name);

现在你可能只使用闭包:

[**edit**: redacted because not a good method]

现在你可以正确地使用闭包:

function makeObject() {
    var THIS = {};

    THIS.name = 'My Object';
    THIS.sayMyName = function () {
        return THIS.name+" is my name";
    }

    return THIS;
}

有许多图书馆支持&#34;更聪明&#34;制作物品的方法。

答案 3 :(得分:1)

正如其他人所写,您需要定位this。我相信这段代码可以帮助您了解javascript中this的工作原理

var name = "The Window";
var object = {
  name : "My Object",
  getNameFunc : function(){
    that = this; // targeting this
    return function() {
      return that.name;
    };
  }
};
alert(object.getNameFunc()()); // it is My Object now

答案 4 :(得分:1)

var object = {
  name : "My Object",
  getNameFunc : function(){
    return (function(){
      return this.name;
     }).bind(this);
  }
};

.bind,使用ES5-shim进行浏览器支持