在javascript中,什么时候要使用它:

(function(){//Bunch of code...
})();

在此:

//Bunch of code...

#1楼

我简直不敢相信答案中没有提到隐含的全局变量。

(function(){})()构造不能防止隐含的全局变量,对我来说,这是一个更大的问题,请参阅http://yuiblog.com/blog/2006/06/01/global-domination/

基本上,功能块确保您定义的所有相关“全局变量”都局限于程序内,它不能保护您免受隐式全局变量的定义。 JSHint等可以提供有关如何防御这种行为的建议。

更简洁的var App = {}语法提供了类似的保护级别,并且在“公共”页面上时,可以包装在功能块中。 (有关使用此构造的库的真实示例,请参见Ember.js或SproutCore )

private财产而言,除非您创建公共框架或库,否则它们会被高估,但是如果您需要实现它们, Douglas Crockford有一些好主意。


#2楼

自调用(也称为自动调用)是指函数在定义后立即执行。 这是一种核心模式,并且是许多其他JavaScript开发模式的基础。

我非常喜欢:),因为:

  • 保持代码最少
  • 它强制行为与表现分离
  • 它提供了一个闭包来防止命名冲突

极大地-(为什么要说它的好?)

  • 这是关于一次定义和执行一个函数。
  • 您可以让该自执行函数返回一个值,然后将该函数作为参数传递给另一个函数。
  • 对封装很有用。
  • 这对于块作用域也很好。
  • 是的,您可以将所有.js文件包含在一个自执行函数中,并可以防止全局命名空间污染。 ;)

这里更多。


#3楼

简单化。 所以看起来很正常,几乎令人安慰:

var userName = "Sean";console.log(name());function name() {return userName;
}

然而。 如果我在页面中包含一个非常方便的javascript库,该库可以将高级字符转换为其基本级别表示形式,该怎么办?

等等...什么

我的意思是。 如果有人输入带有某种重音的字符(例如法语或西班牙语字符),但我只想要“英语”字符? 我的程序中有Az吗? 嗯...西班牙文的“ n〜”和法文的“ e /”字符(我分别使用了两个字符,但是您可能会在思维上跃入代表重音符号的字符),这些字符可以翻译分为“ n”和“ e”的基本字符。

因此,一个好人写了一个全面的字符转换器,我可以将其包含在我的网站中……我将其包含在内。

一个问题:它具有与我的函数相同的名为“ name”的函数。

这就是所谓的碰撞。 我们在同一个作用域中声明了两个具有相同名称的函数。 我们要避免这种情况。

因此,我们需要以某种方式确定代码范围。

在javascript中作用域代码的唯一方法是将其包装在函数中:

function main() {// We are now in our own sound-proofed room and the // character-converter libarary's name() function can exist at the // same time as ours. var userName = "Sean";console.log(name());function name() {return userName;}
}

那可能解决我们的问题。 现在,所有内容都被封闭,只能从我们的打开和关闭括号内访问。

我们在一个函数中有一个函数...看起来很奇怪,但是完全合法。

只有一个问题。 我们的代码无效。 我们的userName变量永远不会回显到控制台中!

我们可以通过在现有代码块之后添加对函数的调用来解决此问题。

function main() {// We are now in our own sound-proofed room and the // character-converter libarary's name() function can exist at the // same time as ours. var userName = "Sean";console.log(name());function name() {return userName;}
}main();

还是之前!

main();function main() {// We are now in our own sound-proofed room and the // character-converter libarary's name() function can exist at the // same time as ours. var userName = "Sean";console.log(name());function name() {return userName;}
}

第二个关注点:尚未使用“ main”这个名字的机会是什么? ...非常非常苗条

我们需要更多的范围界定。 还有一些自动执行main()函数的方法。

现在我们来介绍自动执行功能(或自动执行,自动运行等)。

((){})();

语法令人作呕。 但是,它起作用。

当您将函数定义包装在括号中并包括参数列表(另一个集合或括号!)时,它将充当函数调用

因此,让我们使用一些自动执行的语法再次查看我们的代码:

(function main() {var userName = "Sean";console.log(name());function name() {return userName;}}
)();

因此,在您阅读的大多数教程中,您现在都会被术语“匿名自我执行”或类似的东西所吸引。

经过多年的专业发展,我强烈建议您命名为调试目的编写的每个函数

当出现问题(并且会发生问题)时,您将在浏览器中检查回溯。 当堆栈跟踪中的条目具有名称时,缩小代码问题总是很容易!

long之以鼻,希望对您有所帮助!


#4楼

javascript中的自调用函数:

自调用表达式将自动调用(启动),而不被调用。 自调用表达式创建后立即被调用。 基本上,这用于避免命名冲突以及实现封装。 在此函数之外无法访问变量或声明的对象。 为了避免最小化问题(filename.min),请始终使用自执行函数。


#5楼

这是一个自我调用匿名函数如何有用的可靠示例。

for( var i = 0; i < 10; i++ ) {setTimeout(function(){console.log(i)})
}

输出: 10, 10, 10, 10, 10...

for( var i = 0; i < 10; i++ ) {(function(num){setTimeout(function(){console.log(num)})})(i)
}

输出: 0, 1, 2, 3, 4...


#6楼

看来这个问题已经准备好了,但我还是会发表我的意见。

我知道何时需要使用自执行功能。

var myObject = {childObject: new function(){// bunch of code},objVar1: <value>,objVar2: <value>
}

该函数使我可以使用一些额外的代码来定义更干净代码的childObjects属性和属性,例如设置常用变量或执行数学方程式; 哦! 或错误检查。 而不是限于...的嵌套对象实例化语法

object: {childObject: {childObject: {<value>, <value>, <value>}}, objVar1: <value>,objVar2: <value>
}

通常,编码有很多晦涩的方式来做很多相同的事情,这使您想知道“为什么要打扰?” 但是,新的情况不断出现,您不再只能依靠基本/核心原则。


#7楼

(function(){var foo = {name: 'bob'};console.log(foo.name); // bob
})();
console.log(foo.name); // Reference error

实际上,以上函数将被视为没有名称的函数表达式。

使用封闭的和开放的括号包​​装函数的主要目的是避免污染全局空间。

函数表达式内的变量和函数变为私有(即,它们在函数外部将不可用)。


#8楼

我已经阅读了所有答案, 在此遗漏了一些非常重要的内容 ,我会接吻。 有两个主要原因,为什么我需要自执行匿名函数,或者最好说“ 立即调用函数表达式(IIFE) ”:

  1. 更好的名称空间管理(避免名称空间污染-> JS模块)
  2. 封闭(模拟私有类成员,从OOP已知)

第一个已经很好地解释了。 对于第二个,请研究以下示例:

var MyClosureObject = (function (){var MyName = 'Michael Jackson RIP';return {getMyName: function () { return MyName;},setMyName: function (name) { MyName = name}}
}());

注意1:我们没有为MyClosureObject分配功能, MyClosureObject 调用该功能的结果了 。 请注意最后一行中的()

注意2:您还需要进一步了解Java语言中的函数,即内部函数可以访问内部定义的函数的参数和变量

让我们尝试一些实验:

我可以使用getMyName获取MyName并且可以使用:

 console.log(MyClosureObject.getMyName()); // Michael Jackson RIP

以下巧妙的方法不起作用:

console.log(MyClosureObject.MyName);
// undefined

但是我可以设置另一个名称并获得预期的结果:

MyClosureObject.setMyName('George Michael RIP');
console.log(MyClosureObject.getMyName());
// George Michael RIP

编辑:在上面的示例中, MyClosureObject设计为不带new前缀使用,因此按惯例不应将其大写。


#9楼

自执行功能用于管理变量的范围。

变量的范围是程序在其中定义的区域。

全局变量具有全局范围; 它在JavaScript代码中的任何位置定义,并且可以从脚本中的任何位置(甚至在函数中)进行访问。 另一方面,在函数内声明的变量仅在函数体内定义。 它们是局部变量,具有局部作用域,只能在该函数中访问。 函数参数也算作局部变量,并且仅在函数体内定义。

如下所示,您可以访问函数内部的globalvariable变量,还请注意,在函数主体内,局部变量优先于具有相同名称的全局变量。

var globalvar = "globalvar"; // this var can be accessed anywhere within the scriptfunction scope() {alert(globalvar);localvar = "localvar" //can only be accessed within the function scope
}scope();

因此,基本上,一个自执行函数允许编写代码而无需担心在其他JavaScript代码块中如何命名变量。


#10楼

命名空间。 JavaScript的作用域是功能级别的。


#11楼

IIRC它允许您创建私有属性和方法。


#12楼

其全部与可变作用域有关。 默认情况下,自执行函数中声明的变量仅可用于自执行函数中的代码。 这样就可以编写代码,而不必担心在其他JavaScript代码块中如何命名变量。

例如:

(function(){ var foo = 3; alert(foo);
})(); alert(foo);

这将首先警报“ 3”,然后在下一个警报上引发错误,因为未定义foo。


#13楼

由于Javascript中的函数是一流的对象,因此通过这样定义它,就可以有效地定义一个类似于C ++或C#的“类”。

该函数可以定义局部变量,并在其中包含函数。 内部函数(有效为实例方法)将可以访问局部变量(有效为实例变量),但它们将与脚本的其余部分隔离。


#14楼

范围隔离,也许。 这样,函数声明中的变量不会污染外部名称空间。

当然,在一半的JS实现中,它们仍然会实现。


#15楼

一个区别是,您在函数中声明的变量是局部变量,因此在退出函数时它们将消失,并且不会与其他代码中的其他变量发生冲突。


#16楼

是否有参数,“代码段”返回一个函数?

var a = function(x) { return function() { document.write(x); } }(something);

关闭。 something的值被分配给的函数asomething可能具有一些变化的值(for循环),并且每当a具有新功能时。

用javascript实现自我执行功能的目的是什么?相关推荐

  1. 自己动手实现远程执行功能

    在排查问题的过程中,想查看内存中的一些参数值,却又没有方法把这些值输出到界面或日志中,又或者定位到某个缓存数据有问题,但缺少缓存的统一管理界面,不得不重启服务才能清理这个缓存.类似的需求有一个共同的特 ...

  2. # JavaScript中的执行上下文和队列(栈)的关系?

    原文:What is the Execution Context & Stack in JavaScript? git地址:JavaScript中的执行上下文和队列(栈)的关系? 导读:以前总 ...

  3. html分步调试,一般纯HTML网页的JavaScript的单步执行与调试(以VS2005)

    笔者最近写Script的机会比较多, 难免需要在开发时候进行调试,虽然我们都知道VS2008有针对JavaScript调试的功能,但是无奈项目是在2005和.html页面上进行开发,因此无法" ...

  4. JavaScript ES2019的新增功能

    by Vali Shah 通过瓦利沙阿 JavaScript ES2019的新增功能 (What's new in JavaScript ES2019) Many of us know that th ...

  5. php+js实现异步图片上传,JavaScript实现异步图像上传功能

    当向服务器上传图像时,根据服务器操作的复杂性和服务器性能,需要几秒钟到几分钟的时间来完成.本文的重点是在图像上传至服务器时使用JavaScript立即显示图像. 介绍 当使用JavaScript将图像 ...

  6. drill apache_大数据SQL:Apache Drill查询执行功能概述–白板演练

    drill apache 在本周的白板演练中,MapR Technologies产品管理高级总监Neeraja Rentachintala概述了开源Apache Drill如何在大型数据集上实现交互式 ...

  7. 细聊 JavaScript 的事件执行机制

    细聊 JavaScript 的事件执行机制 我使用的 Node.js 版本是 v12.13.0 的 , 11 的版本前会与11 版本后的事件循环有些区别. 线程? 都说 JavaScript 是单线程 ...

  8. 如何使用html实现在线秒表,使用JavaScript实现网页秒表功能(含开始、暂停、继续、重置功能)...

    效果图展示,感觉不错可以参考实例代码. 具体代码如下所示: Document 00:00:00:00 开始 暂停 继续 重置 //定义一个变量,根据定时器每秒执行一次,每次执行++自增操作,变量存储的 ...

  9. JavaScript中立即执行函数实例详解 转载 作者:李牧羊

    javascript和其他编程语言相比比较随意,所以javascript代码中充满各种奇葩的写法,有时雾里看花,当然,能理解各型各色的写法也是对javascript语言特性更进一步的深入理解.这篇文章 ...

最新文章

  1. 牛客15324 用来作弊的药水
  2. 消息称华为计划推出自有品牌电动汽车 官方重申不造车
  3. P2P风控措施和风控流程
  4. 淘宝详情页设计要点有哪些 优秀淘宝详情页面多少屏合适
  5. js 判断对象数组是否存在某一个对象(全)
  6. 关于WIN10开机启动慢的一些问题解决
  7. Java 下载 Excel模板时,报修正 Excel在“xxx.xlsx”中发现不可读取的内容。是否恢复此工作薄的内容?如果信任此工作簿的来源,请点击是
  8. 人人网移动开发架构及相关服务器架构
  9. 搜狐号按作者火车头采集规则
  10. NDK_PROJECT_PATH=null
  11. 亲历H5移动端游戏微信支付接入及那些坑(一)——支付方式与坑
  12. 用户可以通过软件对计算机,用户可以通过 软件对计算机软、硬件资源进行管理。...
  13. html 输入框键盘遮挡,解决输入框被键盘挡住的问题
  14. 史上最全的各类奖学金、各种称号、各种职位中英文对照
  15. homebridge的移植---target端
  16. nextjs移动端开发总结
  17. 读书百客:《临江仙引·渡口》赏析
  18. Inventor 缩略图异常 无法预览
  19. 分享我的电子藏书:Windows编程(共4本)
  20. 微信小程序流量主终于开通并植入广告成功显示

热门文章

  1. Android StateListDrawable的坑
  2. android stadio 打开别人的工程 一直在编译中
  3. 一文就懂Kotlin作用域函数以及object关键字
  4. SparkStreaming和Storm的区别
  5. 常用git命令思维图
  6. Postman--Pre-request执行其他接口
  7. fiddler下如何将HTTPS转换成HTTP
  8. 计算机教室要配备空调吗,孩子们教室里的空调 到底要不要装?能不能装?
  9. uniapp自定义导航栏
  10. LeetCode Group Anagrams