- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我试图理解 foo.bar()
和 var fn = foo.bar; 之间的区别fn();
我已经举了一个小例子,但我不完全明白为什么失败的人实际上失败了。
var Dog = function() {
this.bark = "Arf";
};
Dog.prototype.woof = function() {
$('ul').append('<li>'+ this.bark +'</li>');
};
var dog = new Dog();
// works, obviously
dog.woof();
// works
(dog.woof)();
// FAILS
var fnWoof = dog.woof;
fnWoof();
// works
setTimeout(function() {
dog.woof();
}, 0);
// FAILS
setTimeout(dog.woof, 0);
产生:
在 JSFiddle 上:http://jsfiddle.net/D6Vdg/1/
所以看起来关闭一个函数会导致它删除它的上下文。行。但是为什么 (dog.woof)();
会起作用呢?
要弄清楚这里发生了什么,有点令人困惑。显然有一些核心语义我只是没有得到。
最佳答案
问题出在上下文和 this
关键字上。
函数本身并不“属于”一个对象。例如,我可以创建一个 cat 对象并将 woof 函数复制过来:
var cat = {
bark: "meow",
woof = Dog.prototype.woof
};
现在 cat.woof
会给我“喵”的一声。由于可以灵活地复制和重新分配函数,var fnWoof = dog.woof;
将 fnWoof
与 dog
分离 - 它没有语境。因此,上下文和 this
关键字默认为 window
。由于 window
没有 bark
属性,您会得到 undefined
。
如果你给窗口一个树皮属性:
window.bark = "Arf";
然后您的代码将起作用(尽管是错误的):
fnWoof(); // "Arf"
要使其按预期工作,您可以传入上下文显式:
fnWoof.call(dog);
关于javascript - 了解 Javascript 调用函数与返回函数但稍后执行函数之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4643049/
我正在编写一个插件,有一个ajax调用向用户显示数据。 如果用户想在ajax成功时添加一些js?他可以从他的 js 脚本中做到这一点吗,比如定位这个 ajax 成功事件。 例如: $(documen
我有 html 代码,例如 - x 最初插入 div 'insert_calendar_eda_form'。 Javascript代码 calendar_eda_add
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 3 年前。 Improve this qu
我已经使用命令 sudo start myservice 启动了一个 upstart 服务。我想要一种方法,以便稍后我(或任何人)可以检查该服务是否已启动并正在运行。检查它的命令是什么? 最佳答案 找
我是一名优秀的程序员,十分优秀!