在Javascript中将函数赋值给变量,并将变量赋值给函数(?)
我通过剖析我以前使用过的其他人编写的一些脚本来学习javascript(stackoverflow是必不可少的!)。这段代码(为了使代码更容易阅读,我从中间剪了很多代码,所有的注释都是我的)来自jquery插件 我不确定作者在这里做什么:在Javascript中将函数赋值给变量,并将变量赋值给函数(?),javascript,function,var,Javascript,Function,Var,我通过剖析我以前使用过的其他人编写的一些脚本来学习javascript(stackoverflow是必不可少的!)。这段代码(为了使代码更容易阅读,我从中间剪了很多代码,所有的注释都是我的)来自jquery插件 我不确定作者在这里做什么: function EventManager(options, _sources) { //called using .call() var t = this; t.isFetchNeeded = isFetchNeeded; //?? as
function EventManager(options, _sources) { //called using .call()
var t = this;
t.isFetchNeeded = isFetchNeeded; //?? assign the function "isFetchNeeded" to the variable (not the value returned by the function)??
var trigger = t.trigger; //?? namespace??
}
function View(element, calendar, viewName) {
var t = this;
function trigger(name, thisObj) {
return calendar.trigger.apply(
calendar,
[name, thisObj || t].concat(Array.prototype.slice.call(arguments, 2), [t])
);
}
}
首先,我猜测this.foo=bar
正在将函数“bar”分配给当前对象中名为“isFetchNeeded”的变量(还不确定为什么要这样做.speed?)
其次,行var foo=this.bar
让我难堪。看起来这可能是某种名称空间魔法
我对第一行的想法正确吗?下一行是干什么的
谢谢变量
此
引用调用函数的上下文。在这种情况下(假设代码在web浏览器中运行)是窗口
对象。第一行简单地将函数isFetchNeeded
指定为此
对象的方法。第二行将this
的成员变量trigger
的值分配给函数EventManager
this.foo=bar
的本地变量,将bar
的值分配给名为foo
的对象成员。这实际上可以是一个函数定义,也可以是一系列其他内容
var trigger=t.trigger
所做的是在EventManager
函数的范围内声明一个名为trigger
的变量。还有在较低范围内定义的其他功能,即pushload
和popLoading
。这些不是对象成员,因此在这些函数中使用this.trigger
将不起作用。var触发器
声明使其可在这些函数中访问
我并不声称自己是有史以来最好的JS程序员,所以我不能说他所做的是否有意义,但你可以看到EventManager.JS
是如何实际使用的(在Calendar.JS
中):
他实际上并没有创建一个EventManager
对象,而是用Calendar
对象调用它的构造函数<代码>日历确实定义了触发器
,这就是var trigger=t.trigger
在EventManager
内部工作的原因。同样,这条线
var isFetchNeeded = t.isFetchNeeded;
在
Calendar.js
中,获取isFetchNeeded
方法“back out”EventManager
,并允许在Calendar
范围内调用它。老实说,您需要一个好的Javascript入门,但并不完全需要。我建议您在10分钟内使用Spencer Tippings的Javascript。Javascript中没有“名称空间”,只有对象属性。你需要把它们和变量区分开来。@Bergi:当然,你是对的。我在想“范围”,但写了“名称空间”@nannoolei:谢谢你的参考。它看起来确实是一个很好的资源。此
既不是变量,也不可能引用全局对象-这些函数都是构造函数。请注意,此引用函数调用的上下文的变量
不正确。函数的此参数的值可以是任何值(在严格模式下)或任何对象。它完全由调用设置,完全独立于调用的执行上下文。这是一个很好的解释。谢谢我不是在考虑较低的范围。现在我明白了为什么作者称第一种类型为“出口”,第二种类型为“进口”。
var isFetchNeeded = t.isFetchNeeded;