我正在学习一些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
,日志返回the global object
而不是sayHello();
,我想知道原因......
答案 0 :(得分:5)
它应该正常工作,除非你将该代码包装在另一个函数中,创建一个新的变量范围。
示例: 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
是对全局对象的引用。
答案 1 :(得分:3)
我的猜测是您正在运行onDomReady
或onLoad
。如果我是正确的,那就是你的问题(或者似乎是在jsFiddle中玩游戏时)。在jQuery之后,不要将它包起来并将其加载到头部或主体中。
请参阅http://jsfiddle.net/morrison/euprL/
原因与范围有关。我认为What is the scope of variables in JavaScript?总结得很好。
答案 2 :(得分:2)
The global object
并不是它实际上要说的。暗示它将返回全局window
对象,这是全局变量等实时变量的对象。除非您有一个名为myName
的全局变量,否则该值将为undefined
。
修改强>
第一次我错过了var myName = 'the global object';
。 var
使它成为当前范围的一部分,正如其他人所指出的那样,除非你处于全局范围内,否则它将找不到变量。
答案 3 :(得分:1)
像这样测试你的代码并且它可以工作:
<html>
<head>
<script type="text/javascript">
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'
</script>
</head>
</html>
您能否提供一些有关此脚本背景的详细信息?