为什么以下代码打印"0 5 10 15 20 ... 100"?
(function () {
for ( var i = 100; i >= 0; i -= 5) {
(function() {
var pos = i;
setTimeout(function() {
console.log(" pos = " + pos);
}, (pos + 1)*10);
})();
}
})();
Run Code Online (Sandbox Code Playgroud)
我声明pos = i,它应该是降序.此代码源自John Resig的fadeIn()函数,在他的书籍Pro javascript技术中.
我有一个这样的代码,我试图在某个按钮上添加一个事件处理程序.我想使用一个全局变量并将其当前值存储在回调闭包中,而不是它的引用.
var globalNum="dummy";
function A()
{
$("#button").click(function()
{
$("#button").append(globalNum);
});
}
globalNum="dummyAgain";
Run Code Online (Sandbox Code Playgroud)
现在,如果点击事件被触发,那么会添加什么 - "dummy"或"dummyAgain"?我相信它将是"dummyAgain"因为存储闭包全局变量的引用.我想要绑定价值.我知道我可以在A中创建一个局部变量,我可以使用全局变量初始化并绑定,但是还有其他更酷的方法吗?
谢谢
我有这样的代码:
<script type="text/javascript">
var currentPicture;//default picture
var picEL;//the image viewer element
jQuery("#backImageShower").hover(
function(i)
{
picEL = jQuery("#dynloadarxdock > img");
currentPicture = picEL.attr("src");
picEl.attr("src","back.jpg");
},
function()
{
picEl.attr("src",currentPicture);
}
);
</script>
Run Code Online (Sandbox Code Playgroud)
但是,当我运行此代码时,它说picEl没有定义.我认为这可能是因为闭包但这段代码完美运行:
<script type="text/javascript">
var currentPicture;//default picture
jQuery("#backImageShower").hover(
function(i)
{
currentPicture = jQuery("#dynloadarxdock > img").attr("src");
jQuery("#dynloadarxdock > img").attr("src","back.jpg");
},
function()
{
jQuery("#dynloadarxdock > img").attr("src",currentPicture);
}
);
</script>
Run Code Online (Sandbox Code Playgroud)
但是这个代码也包含全局变量,它可以工作.
有人可以告诉我为什么吗?
谢谢.
我想知道为什么以下Python代码工作:
def sum(a, b):
return a+b+c
c=3
print sum(1,2)
# result: 6
Run Code Online (Sandbox Code Playgroud)
我本来期望编译错误.当变量不是时,
如何sum定义函数c(我会说这c不在sum函数的范围内)?
这是他们所说的关闭吗?
正如我所理解的那样,变量必须已被"提及",如下面的代码片段(从此站点复制).这里x已经提到了(尽管没有"填写")inc()函数的定义.
def makeInc(x):
def inc(y):
# x is "closed" in the definition of inc
return y + x
Run Code Online (Sandbox Code Playgroud) 我不明白这种行为:
var a = 1;
console.log('a is undefined1:', a == undefined);
var a;
//iterate selected jQuery elements:
jQuery.each(this, function(index, htmlElement) {
console.log('a is undefined2:', a == undefined);
var a;
Run Code Online (Sandbox Code Playgroud)
返回:
a是undefined1:false
a是undefined2:true
如果最后一行(var a;)被注释掉,则返回:
a is undefined1:false
a is undefined2:false
我希望总是后者输出.我不知道什么?
非常感谢!
所以我有以下内容:
Object a = data.getA();
Object b = data.getB();
Object c = data.getC();
// and so on
Run Code Online (Sandbox Code Playgroud)
这些对象是从API调用中检索的,可以为null.我想将这些对象放入List中,但前提是它们不是null.
我可以写一堆行:if(a!=null) {myList.add(a}等等.但我觉得有一种更优雅的方式可以避免每次都进行空检查(除了创建辅助方法来执行此操作).
例如,使用javascript,我可以创建一个闭包.Java的任何想法?
我在我们的项目中使用原型1.4,我曾经以这种方式创建类:
1)方式1
var Person=Class.create();
Person.prototype={
initialize:function(name,age){
this._check(name,age);
this.name=name;
this.age=age;
},
say:function(){
console.log(this.name+','+this.age);
}
_check:function(name,age){
if(typeof(name)!='string' || typeof(age)!='number')
throw new Error("Bad format...");
}
}
Run Code Online (Sandbox Code Playgroud)
但是,在上面的代码中,Person"_check"的方法可以在外部调用,这不是我期望的.
在我以前的帖子中,感谢'TJ Crowder',他告诉我一个解决方案,使该方法完全私密:
2)方式2
var Person=(function(){
var person_real=Class.create();
person_real.prototype={
initialize:function(name,age){
_check(name,age);
this.name=name;
this.age=age;
},
say:function(){
console.log(this.name+','+this.age);
}
}
//some private method
function _check(name,age){
//....the check code here
}
return person_real;
})();
Run Code Online (Sandbox Code Playgroud)
现在,"_ check"不能暴露在外面.
但我现在感到困惑的是,这种方式会导致性能问题还是最好的实践?
由于我们创建类(蓝图)的原因之一是减少重复代码,可以在任何地方多次重复使用.
现在看看"Manner1":
我们创建一个Class"Person",然后我们将所有实例方法放到Person类的原型对象中.然后每次我们打电话给
var obj=new Person('xx',21);
Run Code Online (Sandbox Code Playgroud)
对象"obj"将拥有Person.prototype中的方法."obj"本身并没有任何代码.
但是在"Manner2"中:每次我们打电话:
var obj=new Person('xx',21);
Run Code Online (Sandbox Code Playgroud)
将创建一个新蓝图,每次也会创建诸如"_check"之类的私有方法.是浪费记忆吗?
注意:也许我错了.但我真的很困惑.任何人都可以给我解释一下吗?
我一直在阅读有关闭包和javascript的内容,我认为我得到了它,直到我尝试了这个:
var Object5 = function (param) {
var x = 0;
var squareBrace = function () {
return '[' + param + x + ']';
};
this.toString = function () {
x = x + 1;
return squareBrace();
};
};
Run Code Online (Sandbox Code Playgroud)
然后我运行了这段代码:
var counter = new Object5("Counter: ");
print("Has x:" + ('x' in counter));
print("Has f:" + ('f' in counter));
print("Can access x:" + (!!counter.x));
print("Can Invoke f:" + (!!counter.f));
print(counter.toString());
print(counter.toString());
print(counter.toString());
print(counter.toString());
print(counter.toString());
print(counter.toString());
Run Code Online (Sandbox Code Playgroud)
这就是我得到的:
Has x:false
Has f:false …Run Code Online (Sandbox Code Playgroud) 如果我使用闭包来定义某些东西,那么有一种等待的方法,直到填充变量,然后再转到下一位.
例:
var myVari = someFunction();
$.each(myVari, function(){/*code for each*/});
Run Code Online (Sandbox Code Playgroud)
定义myVari的函数是一个AJAX调用,它可能需要一秒钟或4秒(不是快速)来定义变量.问题是,在AJAX调用产生结果之前,由于myVari为空,$ .each已经被触发并出错.有没有更好的方法来处理这种情况?
我想做这样的事情:
for(var i=0;i<aList.length;i++)
{
aList[i].doSomething();
sleep(500);
}
Run Code Online (Sandbox Code Playgroud)
当然,javascript中没有睡眠功能所以我尝试了以下内容:
for(var i=0;i<aList.length;i++)
{
setTimeout(function(){
aList[i].doSomething();
},500);
}
Run Code Online (Sandbox Code Playgroud)
但是,现在它说没有定义aList [i].由于匿名函数是一个闭包,它实际上是从外部函数的范围读取aList [i],因此在运行setTimeout中的函数时,i已经发生了变化.
有什么方法可以实现这个目标?