在一个函数中引用一个对象文字是否有问题,该函数是该文字的一部分?它似乎工作得很好,但我想确保没有其他含义。
这是我正在谈论的一个例子:
而不是:
var obj = {
key1: "it",
key2: function(){return this.key1 + " works!"}
};
alert(obj.key2());
使用:
var obj = {
key1: "it",
key2: function(){return obj.key1 + " works!"}
};
alert(obj.key2());
答案 0 :(得分:19)
两者都有问题。
var obj = {
key1: "it",
key2: function(){ return this.key1 + " works!" }
};
var func = obj.key2;
alert(func()); // error
当func
未被obj
方法调用时,this
可以引用其他内容(在此处:全局对象" window
&#34 ;)
var obj = {
key1: "it",
key2: function(){ return obj.key1 + " works!" }
};
var newref = obj;
obj = { key1: "something else"; };
alert(newref.key2()); // "something else works"
在这里,我们从另一个引用访问该对象,尽管函数中的obj
现在可能指向其他对象。
所以你必须选择哪种情况更有可能。如果你真的想让它变得安全,你可以使用obj
作用域的封闭,但不能改变:
var obj = (function(){
var local = {
key1: "it",
key2: function(){ return local.key1 + " works always!" }
};
return local;
})();
或bind()
对象的函数:
var obj = {
key1: "it",
key2: function(){ return this.key1 + " works always!" }
}
obj.key2 = obj.key2.bind(obj);
答案 1 :(得分:1)
变量范围绑定会有所不同。如果稍后修改obj,则将修改key2的返回值:
var newobj = obj;
obj = { key1: "new" };
alert(newobj.key2());
现在它提醒“新作品!”,因为即使你在原始对象(现在是key2()
)上调用newobj
,对obj.key1
的引用现在也会绑定到新obj
实例的值。使用this
可以防止这种情况发生。
答案 2 :(得分:1)
如果你没有使用原型对象,你可以这样做。因为对象的所有实例都将返回obj实例的值...
答案 3 :(得分:1)
根据情况,这些技术中的任何一种或两种都可能适用。
函数中this
的值取决于函数的调用方式。如果将函数作为对象的属性调用,如下所示:
obj.key2();
//or
obj["key2"]();
然后this
将成为该对象。对象是通过对象文字还是其他方式创建的是不相关的。
但您可以使用.call()
或.apply()
来调用函数,并将this
显式设置为其他对象。
还要考虑:
var obj = {
key1: "it",
key2: function(){return this.key1 + " works!"}
};
alert(obj.key2()); // alerts "it works!"
var func = obj.key2;
alert(func()); // alerts "undefined works!"
我设置func
以引用与obj.key2
相同的功能,但将其称为func()
不设置this
} obj
。
有关详细信息,请查看what MDN has to say about this
。
答案 4 :(得分:0)
我认为没有任何影响。请确保您不会在任何时候意外地执行此操作:
var obj = {
key1: "it",
key2: key1 + " works!"
}
因为这会导致错误。除此之外,你应该好好去!