标签: closures

Javascript关闭问题

为什么以下代码打印"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技术中.

javascript closures

0
推荐指数
1
解决办法
123
查看次数

JavaScript中的闭包

我有一个这样的代码,我试图在某个按钮上添加一个事件处理程序.我想使用一个全局变量并将其当前值存储在回调闭包中,而不是它的引用.

var globalNum="dummy";
function A()
{
  $("#button").click(function()
  {
     $("#button").append(globalNum);
  });
}

globalNum="dummyAgain";
Run Code Online (Sandbox Code Playgroud)

现在,如果点击事件被触发,那么会添加什么 - "dummy"或"dummyAgain"?我相信它将是"dummyAgain"因为存储闭包全局变量的引用.我想要绑定价值.我知道我可以在A中创建一个局部变量,我可以使用全局变量初始化并绑定,但是还有其他更酷的方法吗?

谢谢

javascript jquery closures

0
推荐指数
1
解决办法
294
查看次数

在jQuery中到达变量

我有这样的代码:

<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)

但是这个代码也包含全局变量,它可以工作.

有人可以告诉我为什么吗?

谢谢.

javascript jquery closures hover

0
推荐指数
1
解决办法
84
查看次数

这是一个Python闭包吗?(或者,为什么这段代码有效?)

我想知道为什么以下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)

python closures

0
推荐指数
1
解决办法
421
查看次数

javascript:创建全局变量的局部范围在设置之前取消定义它

我不明白这种行为:

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

我希望总是后者输出.我不知道什么?

非常感谢!

javascript closures scope local undefined

0
推荐指数
1
解决办法
545
查看次数

Java内部类/闭包

所以我有以下内容:

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的任何想法?

java closures anonymous-class

0
推荐指数
1
解决办法
705
查看次数

使用闭包在原型中使方法成为私有

我在我们的项目中使用原型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 closures prototype-programming

0
推荐指数
1
解决办法
759
查看次数

完全关闭的是什么?

我一直在阅读有关闭包和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)

javascript closures

0
推荐指数
1
解决办法
422
查看次数

有没有办法暂停脚本,直到javascript闭包完成?JavaScript,jQuery,AJAX

如果我使用闭包来定义某些东西,那么有一种等待的方法,直到填充变量,然后再转到下一位.

例:

var myVari = someFunction();
$.each(myVari, function(){/*code for each*/});
Run Code Online (Sandbox Code Playgroud)

定义myVari的函数是一个AJAX调用,它可能需要一秒钟或4秒(不是快速)来定义变量.问题是,在AJAX调用产生结果之前,由于myVari为空,$ .each已经被触发并出错.有没有更好的方法来处理这种情况?

javascript ajax jquery closures

0
推荐指数
1
解决办法
339
查看次数

Javascript如何在迭代列表操作中使用setTimeout?

我想做这样的事情:

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已经发生了变化.

有什么方法可以实现这个目标?

javascript closures anonymous-function settimeout

0
推荐指数
1
解决办法
2347
查看次数