`
q272156430
  • 浏览: 275758 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

js 两个小括号 ()() 的用法

阅读更多

JavaScript 中,考查如下代码:

(function()
{
    alert("cftea");
})();
 

其实这段代码的意思就是执行这个匿名函数,弹出提示框,内容为“cftea”。

可以把上述代码理解为:

function foo()
{
    alert(1);
}
foo();
 

其实相同的功能还有另外两种写法,我们一并列出来如下:

function foo()
{
    alert("cftea");
}
foo();
 
(function()
{
    alert("cftea");
})();
 
(function()
{
    alert("cftea");
}());
 
void function()
{
    alert("cftea");
}()

 

 

 

用途

说了这么多,这东西到底有什么用呢?它可以立即执行一段代码,并把结果赋给变量;打破我们常规的先写函数,再调用的流程,简化书写。

ajax.xmlhttp = (...)(); 

 

 例子:
function Foo() {
    var a = 123;
    this.a = 456;
    (function() {
        alert(a); // 123
        alert(this.a); // undefined
    })();
}
var f = new Foo();
 

以上代码,先显示 123,再显示 undefined,说明 alert(this.a); 这句中 this 是指本 function 的,而不是其外部 function 的。如果要使用外部的成员,可使用参数的形式传入:

function Foo() {
    var a = 123;
    this.a = 456;
    (function(a) {
        alert(a); // 456
    })(this.a);
}
var f = new Foo();

 

 

很好理解,再看看下面的:

function Foo() {
    var a = 123;
    this.a = 456;
    (function() {
        alert(a); // 123
        alert(this.a); // undefined
        this.b = 789;
    })();
    (function() {
        alert(this.b); // 789
    })();
}
var f = new Foo();
(function() {
    alert(this.b); // 789
})();
同样是先显示 123,然后显示 undefined,然后显示 789,最后又是一个 789。这说明用两个小括号括起来的都是位于一个执行上下文中的,不论这些代码放在哪里。

再看看:

function Foo() {
    (function() {
        this.b = 789;
    })();
    (function() {
        alert(this.b); // 789
        var b = 0;
        alert(b); // 0
    })();
}
var f = new Foo();
(function() {
    alert(this.b); // 789
    alert(b); // 789
})();
令人意外的是,最后一个 alert(b),结果仍然是 789。

更深入一步:

function Foo() {
    (function() {
        this.b = 789;
    })();
    (function() {
        alert(this.b); // 789
        alert(b); // undefined
        var b = 0;
        alert(b); // 0
    })();
}
var f = new Foo();
(function() {
    alert(this.b); // 789
    alert(b); // 789
})();

 

 

从上,我们可以看出,取值时、没有加 this 时:如果当前 () 中不存在同名的局部变量,则等同于加 this 处理;如果当前 () 中存在同名的局部变量,则按常规处理。

 
 
 
 
 
 
分享到:
评论
4 楼 手心的水滴 2012-11-08  
function Foo() {
    (function() {
        this.b = 789;  // window.b = 789
    })();
    (function() {
        alert(this.b); // 789, window.b
        var b = 0;
        alert(b); // 0, 这样的测试也写出来了!
    })();

我想问一下
黑体 部分var b = 0; 这个是window的还是局部的?
什么道理
非的this.b 才能是window的么?
3 楼 showthesunli 2012-05-12  
博主说了这么多,我来说说我的想法,不晓得对不对

总结一下,如下代码:

function Foo() { 
    (function() { 
        this.b = 789; 
    })(); 
    (function() { 
        alert(this.b); // 789 
        alert(b); // undefined 
        var b = 0; 
        alert(b); // 0 
    })(); 

var f = new Foo(); 
(function() { 
    alert(this.b); // 789 
    alert(b); // 789 
})(); 


上面代码执行new Foo()的时候,Foo()函数里面的两个小括号是DOMWindow对象调用的,所以其中的this向DOMWindow,所以 两个小括号之中的this.b = 789 其实相当于window.b = 789


不晓得我这样说对不对
2 楼 aqbzwxd 2011-12-12  
就是这种盲目无原理依据的研究测试弄晕了我, 有必要这么做吗? 其实理解了原理就没必要搞这么多一个一个的试, 然后得出规律, ECMAScript规则都已经定义好了.
var的规则是: 使用var声明变量就是内部变量, 否则就是先调用全局变量, 不管多少层函数.
this的规则是: method函数里的this永远指向自身, 普通函数的this永远指向DOMWindow.

// GodDamnTest1
function Foo() { 
    var a = 123;  // 局部变量, 所有子函数的全局变量
    this.a = 456;  // 对象属性
    (function() { 
        alert(a); // 123, 全局
        alert(this.a); // undefined, 普通函数, this指向DOMWindow 
    })(); 

var f = new Foo();

// GodDamnTest2
function Foo() { 
    var a = 123; 
    this.a = 456; 
    (function(a) {  // 局部声明
        alert(a); // 456, 被函数局部声明的a覆盖了全局 
    })(this.a); 

var f = new Foo();

// GodDamnTest3
function Foo() { 
    var a = 123; 
    this.a = 456; 
    (function() { 
        alert(a); // 123, 全局
        alert(this.a); // undefined, DOMWindow
        this.b = 789;  // window.b = 789
    })(); 
    (function() { 
        alert(this.b); // 789, window.b
    })(); 

var f = new Foo(); 
(function() { 
    alert(this.b); // 789, window.b
})();

// GodDamnTest4
function Foo() { 
    (function() { 
        this.b = 789;  // window.b = 789
    })(); 
    (function() { 
        alert(this.b); // 789, window.b
        var b = 0; 
        alert(b); // 0, 这样的测试也写出来了!
    })(); 

var f = new Foo(); 
(function() { 
    alert(this.b); // 789, window.b
    alert(b); // 789, window.b
})(); 
令人意外的是,最后一个 alert(b),结果仍然是 789。  // no damn surprise at all!

// GodDamnTest5
function Foo() { 
    (function() { 
        this.b = 789;  // window.b = 789
    })(); 
    (function() { 
        alert(this.b); // 789, window.b
        alert(b); // undefined, 全局
        var b = 0; 
        alert(b); // 0, 还有这种测试!
    })(); 

var f = new Foo(); 
(function() { 
    alert(this.b); // 789, window.b
    alert(b); // 789, window.b
})();
1 楼 select*from爱 2010-08-02  
写的不错,很好的解答了我的困惑

相关推荐

    Javascript小括号“()”的多义性

    这两个数组方法接收一个可迭代对象或类数组对象并转换成数组。例如,`Array.from('hello')`会返回字符数组,而`Array.of(1, 2, 3)`创建一个包含三个元素的数组。 总的来说,JavaScript中的小括号“()”在不同的上...

    JS使用正则表达式获取小括号、中括号及花括号内容的方法示例

    这个正则表达式的模式由两部分组成:`\(` 表示匹配左小括号,`\)` 表示匹配右小括号。`(.+?)` 是一个非贪婪捕获组,它会捕获从左括号到右括号之间尽可能少的任何字符(除了换行符)。`g` 是全局标志,表示匹配所有...

    JS正则替换掉小括号及内容的方法

    `replace()` 方法接受两个参数:第一个是正则表达式,第二个是要替换为的新内容。在这个例子中,我们没有提供新内容,所以匹配到的括号及其内容将被替换为空字符串,即删除它们。 `g` 是一个修饰符,表示全局匹配,...

    解析Javascript小括号“()”的多义性

    在JavaScript编程语言中,小括号“()`”的多义性是其语法灵活性的一个关键特性。下面我们将详细探讨这五种不同的语义: 1. **函数声明时的参数列表**: 在JavaScript中,当你声明一个函数时,小括号用于包含函数的...

    JS 正则表达式中小括号的应用

    **功能说明**:捕获分组是最常见的小括号用法之一。它将一个或多个字符作为一个整体对待,并能够捕获这些字符以便后续使用。这种分组方式可以与量词(如`*`、`+`、`?`)、选择符(如`|`)等其他正则表达式元素结合...

    微信小程序base64加解密

    本篇将详细介绍微信小程序中的Base64加解密以及相关的使用方法。 Base64是一种基于64个可打印字符来表示二进制数据的编码方式。这64个字符包括大小写字母、数字以及"+"和"/",最后还会用到一个等于号"="作为填充。...

    js中将多个语句写成一个语句的两种方法小结

    总的来说,通过使用逗号运算符和花括号,我们可以有效地将多个JavaScript语句组合在一起,以提高代码的可读性和效率。然而,要注意,虽然这种技巧可以节省空间,但过度使用可能会降低代码的清晰度,因此在实际编程中...

    javascript中eval解析JSON字符串.docx

    但如果是两个或更多键值对,就需要使用小括号了: ```javascript var str = '{"name":"hanzichi","age":10}'; var obj = eval(str); // SyntaxError: Unexpected token ``` #### 四、注意事项 尽管`eval()`可以...

    JS使用replace()方法和正则表达式进行字符串的搜索与替换实例

    首先,replace()方法接收两个参数,第一个参数是一个正则表达式(可以是RegExp对象或字符串形式),用于指定要替换的子串;第二个参数是一个字符串或函数,用于定义替换的内容。使用正则表达式可以完成许多复杂的...

    vscode在大括号中回车不自动换行缩进的解决方法(一招解决)

    在使用Visual Studio Code (VSCode) 这款强大的代码编辑器进行编程时,有时会遇到一些小困扰,比如在大括号中按下回车键不自动换行并缩进的问题。这个问题对于程序员来说,确实会影响编码的流畅度和效率。本文将详细...

    详解JS正则replace的用法方法_.docx

    ### 详解JS正则`replace`的用法 本文旨在深入解析JavaScript中正则表达式与`replace`方法的结合使用技巧。通过一系列基础知识的复习和实战案例的演示,帮助读者掌握这一强大的文本处理工具。 #### 一、正则表达式...

    javascript文档

    concat 方法 (String) 返回一个包含给定的两个字符串连接的String 对象。 条件(三元)运算符 (?:) 根据条件执行两个表达式之一。 constructor 属性 指定创建对象的函数。 continue 语句 停止循环的当前迭代...

    常用 JS javascript 大全

    在JavaScript中,可以使用`Date`对象来计算两个日期之间的差异,通过比较这个差异是否小于或等于100年,来实现这一功能。 #### 1.3 日期格式转换:yyyy-MM-dd → yyyymmdd 在JavaScript中,可以通过字符串操作函数...

    Javascript unpacker and beautifier js 解压缩工具

    JavaScript Unpacker 和 Beautifier 是两个在Web开发领域中用于处理JavaScript代码的工具。它们的主要目的是为了帮助开发者理解和优化复杂的JavaScript代码。 JavaScript Packer 是一个工具,它将源代码压缩成更小...

    JSON 的所有JS (javascript )

    这两个方法是JSON处理的核心功能。 2. **json_parse_state.js**:此文件可能包含了一个JSON解析器的状态管理部分。在解析JSON字符串时,由于JSON语法有其特定规则,如键必须是字符串,值可以是多种类型等,因此解析...

    javascript基础

    - **脚本编写语言**:JavaScript是一种脚本语言,它采用小程序段的方式实现编程,其基本结构形式与C、C++、VB、Delphi等语言类似。然而,JavaScript与其他这些语言的不同之处在于它是解释型语言,在程序运行过程中被...

    JS检测中文和全角符号JS代码

    示例代码中定义了两个名为 `isSBCcase` 的函数,分别用于检测全角符号和中文字符。 #### 2.1 函数声明 函数使用 `function` 关键字进行声明,后面跟函数名和参数列表。 - `function isSBCcase(str) {...}`:定义了...

    javascript实现简单计算器

    例如,两个数相加的表达式是: ```javascript let result = num1 + num2; ``` 为了实现连续运算,我们可能需要存储前一次的运算结果,并提供括号支持。这涉及到操作栈的概念,可以使用数组模拟栈来处理优先级问题...

    JavaScript数据类型知识点总结及基础类型的使用方法.docx

    JavaScript 数据类型知识点总结及基础类型的使用方法 JavaScript 中的数据类型是指在编程语言中对常用的各种数据类型进行明确的划分,以便让计算机正确的识别和处理不同的数据类型。在 JavaScript 中,常用的数据...

Global site tag (gtag.js) - Google Analytics