在javascript中,你想什么时候使用它:
(function(){
//Bunch of code...
})();
Run Code Online (Sandbox Code Playgroud)
对此:
//Bunch of code...
Run Code Online (Sandbox Code Playgroud) 我是JavaScript和YUI的新手.在YUI库示例中,您可以找到此构造的许多用法:
(function() {
var Dom = YAHOO.util.Dom,
Event = YAHOO.util.Event,
layout = null,
...
})();
Run Code Online (Sandbox Code Playgroud)
我认为最后几个括号是在声明之后执行该函数.
...但是围绕函数声明的前一组括号怎么样?
我认为这是一个范围问题; 这是将内部变量隐藏到外部函数和可能的全局对象中.是吗?更一般地说,这些括号的机制是什么?
我想使用这种模式是新的热点,但我不明白它的优点是什么,我不理解范围的含义.
模式:
(function(window, document, undefined){
window.MyObject = {
methodA: function() { ... },
methodB: function() { ... }
};
})(window, document)
Run Code Online (Sandbox Code Playgroud)
所以我对此有几个问题.
封装像这样的对象有什么特别的优势吗?
为什么窗口和文档被输入而不是正常访问?
为什么undefined要传递这个?
将我们正在创建的对象直接附加到窗口是一个特别好的主意吗?
我已经习惯了我称之为Crockford风格的Javascript封装(因为我把它从Douglas Crockford Javascript视频中删除了).
NameSpace.MyObject = function() {
// Private methods
// These methods are available in the closure
// but are not exposed outside the object we'll be returning.
var methodA = function() { ... };
// Public methods
// We return an object that uses our private …Run Code Online (Sandbox Code Playgroud) 为什么现代JavaScript文件使用如下构造:
(function () {
// some real code
}());
Run Code Online (Sandbox Code Playgroud)
即我理解正在创建一个匿名函数,然后立即调用,没有传递任何参数......但为什么这样做而不只是调用some real code?什么是外部圆形支架?
特别是我正盯着Github 上的文件js/start.js:
(function() {
"use strict";
wooga.castle.GRID_UNIT = 48;
wooga.castle.IMAGES_BASE_URL = "images/entities/";
(function () {
var style = document.createElement('div').style,
prefix;
var candidates = {
webkit: 'webkitTransform',
moz: 'MozTransform', // 'M' is uppercased
ms: 'msTransform',
o: 'oTransform',
'': 'transform'
};
for (var prefix in candidates) {
var candidate = candidates[prefix];
if ('undefined' !== typeof style[candidate]) {
wooga.castle.prefix = prefix;
wooga.castle.prefixedTransform = candidate;
break; …Run Code Online (Sandbox Code Playgroud) 我知道函数是javascript中的对象,并且可以将这些函数分配给变量.我也知道这个问题:(function(){})()构造如何工作以及人们为什么使用它?.
但我想确切地知道在这种情况下它意味着什么:https: //github.com/zsolt/retwis-nodejs/blob/master/domain.js#L43
User = function(){}
Run Code Online (Sandbox Code Playgroud)
这一行后面是"假定" User对象的一些成员函数(方法?)的声明.在SO中似乎没有其他解释的答案.
我试图通过 typescript 文档来理解与 ES6 模块相同的模块。
typescript-modules - Typescript 模块的文档。它说
模块在自己的作用域内执行,而不是在全局作用域内执行;这意味着模块中声明的变量、函数、类等在模块外部不可见,除非使用其中一种导出形式显式导出它们。相反,要使用从不同模块导出的变量、函数、类、接口等,必须使用其中一种导入形式进行导入。
和
在 TypeScript 中,就像在 ECMAScript 2015 中一样,任何包含顶级导入或导出的文件都被视为模块。相反,没有任何顶级导入或导出声明的文件被视为其内容在全局范围内可用的脚本(因此也适用于模块)。
它表示文件中没有导入或导出语句的任何内容都可以全局使用。但事实并非如此。
脚本1.js
var variable = "Hello";
script2.js
console.log(variable);
根据文档中编写的声明,当我运行 script2.js 时,它不应该给出任何错误并控制台变量的值,因为 script1.js 没有 import、export 语句,因此变量在全局范围内可用。但它给出了一个错误。那么脚本内容在全局范围内可用是什么意思呢?
可能重复:
以下JavaScript构造是否称为Closure?
围绕JavaScript对象/函数/类声明的括号是什么意思?
(function(){})()构造如何工作以及人们为什么使用它?
(function(){})()之间的区别; 和function(){}();
嗨,
因为我正在查看一个只有简单的html文本的站点而没有图形我想到查看它的代码.
当我这样做时,我找到了这个脚本
<script type="text/javascript">
var _gaq = _gaq || [];
_gaq.push(['_setAccount', 'UA-13137273-2']);
_gaq.push(['_trackPageview']);
(function() {
var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
})();
</script>
Run Code Online (Sandbox Code Playgroud)
使用如下代码有什么特殊目的
(function() { /*code;*/ })();
Run Code Online (Sandbox Code Playgroud)
我在jquery中看到过它.但我对自由风格的极端JavaScript编程仍然不太满意.
建议,意见和答案.任何都会很好.
谢谢
[我在第一个答案后写这个.在某种意义上的极端......这是我在其他编程语言中找不到的,而且我无法猜到它可能是什么.除了javascript中有很多非凡的选项,我提到它是极端的.也许我应该使用另一项工作.]