有人能解释一下JavaScript中的函数包装语法吗?

有人能解释一下JavaScript中的函数包装语法吗?,javascript,syntax,Javascript,Syntax,我理解下面示例中变量范围的概念,但是有人能解释一下函数包装语法吗。。。;,e、 你如何在实际的日常JavaScript编程中使用它?这不是我从PHP/Java/C知道的 window.onload = function() { var i = 4; console.log(i); //4 (function showIt() { var i = 'whatever'; console.log(i); //whatever })();

我理解下面示例中变量范围的概念,但是有人能解释一下函数包装语法吗。。。;,e、 你如何在实际的日常JavaScript编程中使用它?这不是我从PHP/Java/C知道的

window.onload = function() {
    var i = 4;
    console.log(i); //4
    (function showIt() {
        var i = 'whatever';
        console.log(i); //whatever
    })();
    console.log(i); //4
};

JavaScript具有函数文本。它所做的只是生成一个函数文本,并调用表达式的结果。这个名字让你困惑吗?所有名称都将用于引用其自身主体中的函数,并且是可选的。请注意,这与IE 8及更早版本不兼容。

JavaScript具有函数文本。它所做的只是生成一个函数文本,并调用表达式的结果。这个名字让你困惑吗?所有名称都将用于引用其自身主体中的函数,并且是可选的。请注意,这与IE 8及更早版本不兼容。

这是使用函数showIT{…}定义一个函数showIT,类似于您已经熟悉的函数。结尾处的直接调用定义的同一行中的函数。这可能是你不熟悉的部分。就像你说showIT来调用函数一样,你可以用实际的定义替换名称,它将在Javascript中工作

这是使用函数showIT{…}定义函数showIT,类似于您已经熟悉的函数。结尾处的直接调用定义的同一行中的函数。这可能是你不熟悉的部分。就像你说showIT来调用函数一样,你可以用实际的定义替换名称,它将在Javascript中工作

与C中变量名有块作用域不同,像Pico这样的JavaScript只有函数作用域


因此,如果您想创建一个新的名称范围,您不能像在C中那样只使用{…},您必须使用函数{…}

与C中变量名有块作用域不同,像Pico这样的JavaScript只有函数作用域


因此,如果您想创建一个新的名称范围,您不能像在C中那样只使用{…},您必须使用函数{…}

此表单有几种有用的方式。一种是在词汇上限定代码段的范围,使其内部变量和方法与包含它的较大代码体保持分离。通过这种方式,它是JavaScript进行块范围划分的方式。但我使用此格式的最常见方式是作为此格式的替代:

var ret = {
    depth:0,
    initialized:false,
    helper:function() { /*help with some stuff*/ },
    initialize:function(){ /*do some initialization code*/ },
    action:function(){/*do the thing you want*/}
    destroy:function() { /*clean up*/ }
}
这种格式最让我头疼的是,查找缺少的大括号和逗号非常耗时。例如,上面的代码不起作用,因为操作声明末尾没有逗号,除非我指出,否则很难找到问题,因为当抛出异常时,它会抛出到整个语句上,而不是引发问题的部分。这是一个可以预见的问题,如果可以避免的话,我就不再使用这种格式了。我拒绝。相反,同样的内容可以写得更清楚,如:

var ret = (function(){
    var self = {},
        initialized = false;

    var helper = function() { /*help with some stuff*/ };

    self.depth = 0;
    self.initialize = function() {/*do some initialization*/};
    self.action = function() {/*do the thing you want*/};
    self.destroy = function() { /*clean up*/ };

    return self;
}());
对我来说有两大优势。第一,当抛出异常时,可以更容易地找到缺少的大括号和逗号,行号将接近缺少的区域。第二,您可以选择将一些变量和方法保持私有,并保留第一块代码的所有优点

对于这种格式,我将给出的最后一个插件是,上面的代码有点像一个单例,可以通过1移除外部的调用括号,2将self={}更改为self=this,3在末尾选择性地移除返回self来转换为构造函数:

var Ret = function(){
    var self = this,
        initialized = false;

    var helper = function() { /*help with some stuff*/ };

    self.depth = 0;
    self.initialize = function() {/*do some initialization*/};
    self.action = function() {/*do the thing you want*/};
    self.destroy = function() { /*clean up*/ };

    return self; // this is ignored by the compiler if used as a constructor
};
var ret = new Ret();

此表单有几种有用的方式。一种是在词汇上限定代码段的范围,使其内部变量和方法与包含它的较大代码体保持分离。通过这种方式,它是JavaScript进行块范围划分的方式。但我使用此格式的最常见方式是作为此格式的替代:

var ret = {
    depth:0,
    initialized:false,
    helper:function() { /*help with some stuff*/ },
    initialize:function(){ /*do some initialization code*/ },
    action:function(){/*do the thing you want*/}
    destroy:function() { /*clean up*/ }
}
这种格式最让我头疼的是,查找缺少的大括号和逗号非常耗时。例如,上面的代码不起作用,因为操作声明末尾没有逗号,除非我指出,否则很难找到问题,因为当抛出异常时,它会抛出到整个语句上,而不是引发问题的部分。这是一个可以预见的问题,如果可以避免的话,我就不再使用这种格式了。我拒绝。相反,同样的内容可以写得更清楚,如:

var ret = (function(){
    var self = {},
        initialized = false;

    var helper = function() { /*help with some stuff*/ };

    self.depth = 0;
    self.initialize = function() {/*do some initialization*/};
    self.action = function() {/*do the thing you want*/};
    self.destroy = function() { /*clean up*/ };

    return self;
}());
对我来说有两大优势。第一,当抛出异常时,可以更容易地找到缺少的大括号和逗号,行号将接近缺少的区域。第二,您可以选择将一些变量和方法保持私有,并保留第一块代码的所有优点

最后一个插头是t 他的格式是,上面的代码有点像一个单例,可以通过1移除外部的调用括号,2将self={}更改为self=this,3在末尾选择性地移除返回self来转换为构造函数:

var Ret = function(){
    var self = this,
        initialized = false;

    var helper = function() { /*help with some stuff*/ };

    self.depth = 0;
    self.initialize = function() {/*do some initialization*/};
    self.action = function() {/*do the thing you want*/};
    self.destroy = function() { /*clean up*/ };

    return self; // this is ignored by the compiler if used as a constructor
};
var ret = new Ret();

小挑剔:你不会说showIt来像那样调用函数,命名函数文字与函数定义不同。但不管怎样+1:这一点值得一提。我的jsfu是最小的,我还在努力。谢谢小挑剔:你不会说showIt来像那样调用函数,命名函数文字与函数定义不同。但不管怎样+1:这一点值得一提。我的jsfu是最小的,我还在努力。谢谢我发现它对于不能直接使用var-somevar=iteratelist[I]的循环很有用;因为我在每次迭代中都会改变,我发现它对于我不能直接使用var-somevar=iteratelist[i]的循环很有用;因为我会随着每次迭代而改变。