问题描述
|
我正在用这本很棒的书学习一些jQuery基础知识:http://jqfundamentals.com/book/
有一个示例无法返回正确的结果。
这是代码:
var myName = \'the global object\',sayHello = function () {
console.log(\'Hi! My name is \' + this.myName);
},myObject = {
myName : \'Rebecca\'
};
var myObjectHello = sayHello.bind(myObject);
sayHello(); // logs \'Hi! My name is the global object\'
myObjectHello(); // logs \'Hi! My name is Rebecca\'
日志返回undefined
而不是sayHello();
的the global object
,我想知道为什么...
解决方法
除非您已将该代码包装在另一个函数中,然后创建了新的变量作用域,否则它应该可以正常工作。
示例:http://jsfiddle.net/RKYNn/
因此,
myName
不能作为全局对象的属性使用。
因此,如果您这样做:
(function() {
var myName = \'the global object\',sayHello = function () {
console.log(\'Hi! My name is \' + this.myName);
},myObject = {
myName : \'Rebecca\'
};
var myObjectHello = sayHello.bind(myObject);
sayHello(); // logs \'Hi! My name is the global object\'
myObjectHello(); // logs \'Hi! My name is Rebecca\'
})();
...您将得到undefined
,因为myName
不再是全局的,并且函数中的this
是对全局对象的引用。
, 我的猜测是您正在运行onDomReady
或onLoad
。如果我是对的,那就是你的问题(或者似乎是在jsFiddle中玩耍时出现的问题)。不要将其包装起来,并将其加载到jQuery之后的头部或主体中。
参见http://jsfiddle.net/morrison/euprL/
原因与范围界定有关。 JavaScript中变量的范围是什么?我认为总结得很好。
, The global object
实际上不是要说的。暗示它将返回全局“ 12”对象,这是全局变量和此类变量所在的位置。除非您有一个名为“ 4”的全局变量,否则该值将为“ 1”。
编辑
我第一次错过了15英镑。 var
使其成为当前范围的一部分,因此正如其他人指出的那样,除非您位于全局范围内,否则它将找不到该变量。
, 像这样测试您的代码,它可以工作:
<html>
<head>
<script type=\"text/javascript\">
var myName = \'the global object\',myObject = {
myName : \'Rebecca\'
};
var myObjectHello = sayHello.bind(myObject);
sayHello(); // logs \'Hi! My name is the global object\'
myObjectHello(); // logs \'Hi! My name is Rebecca\'
</script>
</head>
</html>
您能否向我们提供有关此脚本上下文的一些详细信息?