Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/google-chrome/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 闭包名称与其内部同名函数冲突,但仅在Chrome中冲突_Javascript_Google Chrome_Closures - Fatal编程技术网

Javascript 闭包名称与其内部同名函数冲突,但仅在Chrome中冲突

Javascript 闭包名称与其内部同名函数冲突,但仅在Chrome中冲突,javascript,google-chrome,closures,Javascript,Google Chrome,Closures,这会被认为是Chrome bug还是Safari/Firefox的宽大处理 当我创建一个闭包函数时,我给它一个任意的名字“Button”。在闭包中,我有一个函数,它是闭包创建的主对象的构造函数,也称为“Button” 闭包返回对Button的引用,可能是内部函数Button() 在Safari和Firefox中,这不是问题。调用new closure.Button()返回内部按钮()的实例。然而,在Chrome中,当内部函数名与闭包函数名匹配时,构造函数似乎不会被调用。返回的似乎是闭包函数本身。

这会被认为是Chrome bug还是Safari/Firefox的宽大处理

当我创建一个闭包函数时,我给它一个任意的名字“Button”。在闭包中,我有一个函数,它是闭包创建的主对象的构造函数,也称为“Button”

闭包返回对Button的引用,可能是内部函数Button()

在Safari和Firefox中,这不是问题。调用new closure.Button()返回内部按钮()的实例。然而,在Chrome中,当内部函数名与闭包函数名匹配时,构造函数似乎不会被调用。返回的似乎是闭包函数本身。当然,当内部函数定义我稍后尝试调用的方法时,这会导致错误

我发布这个问题有两个原因:

1) 我花了一天多的时间才找到问题的原因,这是因为Chrome报告我的按钮没有method.activate(在我的实际代码中,按钮继承自提供.activate()方法的父对象)。如果其他人遇到这个问题,他们可能会在这里找到我的问题,从而节省一些时间


2) 我想知道:如果这是我的一个错误,对闭包和闭包中的函数使用相同的名称,为什么它在Safari/Firefox中工作?更具体地说,Chrome是否确实以某种方式使闭包返回自身而不是预期的内部功能?这是一个bug吗?

可能不是确切的问题,但是您不必要地命名了函数表达式

var closure = (function Button(){

    //the closure's primary object
    function Button(target) {
        //constructor for our button object
    }

    Button.prototype = e.inherit(e.Plugin.prototype);
    Button.prototype.constructor = Button;

    return {
            Button: Button,
        };

}());
//now let's call our closure to create a new Button
var newButton = new closure.Button()
应该是

var closure = (function (){

    //the closure's primary object
    function Button(target) {
        //constructor for our button object
    }

    Button.prototype = e.inherit(e.Plugin.prototype);
    Button.prototype.constructor = Button;

    return {
            Button: Button
        };

}());

//now let's call our closure to create a new Button
var newButton = new closure.Button();
区别在于顶级函数未命名。不需要命名你将永远不再使用的东西

此外,返回对象中不应包含逗号。这应该是一个语法错误


另外,最后一行没有结束分号。

Chrome中没有复制:我听说IE中命名函数表达式有问题(请参阅),但Chrome中没有。事实上,@SeanKinsey的测试在Chrome上似乎效果很好。是什么让你认为构造函数没有被调用?这没有任何帮助-JavaScript的词法范围防止了这一问题。关于命令和半命令的NIT是正确的,但在这个问题上并不谨慎。@SeanKinsey我不认为这没有帮助。虽然你有权利,但很难解决你无法重现的问题。我只是试着跑完全程。
var closure = (function (){

    //the closure's primary object
    function Button(target) {
        //constructor for our button object
    }

    Button.prototype = e.inherit(e.Plugin.prototype);
    Button.prototype.constructor = Button;

    return {
            Button: Button
        };

}());

//now let's call our closure to create a new Button
var newButton = new closure.Button();