`
q272156430
  • 浏览: 269764 次
  • 性别: 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手册

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

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

    Javascript 中将多个语句写成一个语句的两种方法小结 一、使用逗号运算符将多个语句写成一个语句  1.一次声明多个变量  var i=1,j=1,k=1  2.多个语句用逗号间隔  i=1,j=i+2,k=j+2  二、使用花括号将多个语句写...

    javascript文档

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

    JavaScript经典实例

     1.1连接两个或多个字符串  1.2连接字符串和另一种数据类型  1.3条件比较字符串  1.4在字符串中查找子字符串  1.5从一个字符串提取子字符串  1.6检查一个存在的、非空的字符串  1.7将一个关键字字符串分解为...

    简单快速的实现js计算器功能

    想写一个简易的计算器,本来以为要不了多久就能写出来的,谁知道愣是花费了我近两个小时的时间来写,但结果还是不能令我满意。想找一个更好的方法来写,不想写的那么麻烦,用什么方法呢?想了一个遍,后来猛然看到...

    JavaScript两种计时器的实例讲解

    通过使用 JavaScript,我们有...setInterval()的使用方法:  setInterval(code,millisec); code:可以是方法名,如果是方法不要加小括号。同时也可以是字符串用双引号将方法括起来。setInterval(“setCode()”,10

    JScript 语言参考

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

    JavaScript笔记

    使用方法:方法名()-->方法调用-->立即执行 2.js文件:网页外专门保存js脚本的文件--推荐 强调:HTML、CSS、JS都要使用UTF-8编码保存(window系统) 使用js文件引入网页:[removed][removed] 强调:一旦定义...

    正则表达式

    JavaScript的RegExp对象和String对象定义了使用正则表达式来执行强大的模式匹配和文本检索与替换函数的方法. 在JavaScript中,正则表达式是由一个RegExp对象表示的.当然,可以使用一个RegExp()构造函数来创建RegExp...

    javascript学习(二)javascript常见问题总结

    1、JS中方法和变量都是区分大小写的 2、单引号、双引号在JS中没有特殊的区别,都可以用来创建字符串。但作为一般性规则,大多数开发人员喜欢用单引号而不是双引号,但是XHTML规范要求所有属性值都必须使用双引号括...

    Java-PHP-C#

    现在把一定数量的字符放到小括号里,比如: "a(bc)*": 匹配 a 后面跟0个或者一个"bc"; "a(bc){1,5}": 一个到5个 "bc." 还有一个字符 '│', 相当于OR 操作: "hi│hello": 匹配含有"hi" 或者 "hello" 的 ...

    正则表达式30分钟入门教程

    使用小括号指定一个子表达式后,匹配这个子表达式的文本(也就是此分组捕获的内容)可以在表达式或其它程序中作进一步的处理。默认情况下,每个分组会自动拥有一个组号,规则是:从左向右,以分组的左括号为标志,...

    freemarker总结

    可以看到例子中使用的两个同名变量并没有冲突,因为它们位于不同的名字空间 l 可以使用assign指令在导入的名字空间中创建或替代变量,下面是一个例子: ${my.mail} ${my.mail} l 输出结果: jsmith@...

    EditPlus 2整理信箱的工具

    这个也算正则表达式的用法,其实仔细看正则表达式应该比较简单,不过既然有这个问题提出,说明对正则表达式还得有个认识过程,解决方法如下 解决: 在替换对话框中,启用“正则表达式”复选框 在查找内容里面输入...

    Editplus 3[1].0

    这个也算正则表达式的用法,其实仔细看正则表达式应该比较简单,不过既然有这个问题提出,说明对正则表达式还得有个认识过程,解决方法如下 解决: 在替换对话框中,启用“正则表达式”复选框 在查找内容里面输入...

    整理后java开发全套达内学习笔记(含练习)

    boolean (8bit,不定的)只有true和false两个值 char 16bit, 0~2^16-1 (2^16=6万6) byte 8bit, -2^7~2^7-1 (2^7=128; 注意:两个 byte 数相加,变 int 型) short 16bit, -2^15~2^15-1 (2^15=32768) int 32bit, ...

    十天学会ASP.net--我认为ASP.NET比ASP难很多,希望大家做好准备

    然后再下载一个.NET FRAMEWORK SDK,安装以后会在控制面板里面的管理工具里面多两个东西,这个不用理睬他,我们要使用的还是原来的INTERNET服务管理器。打开它按照ASP教程里面的调试方法建立一个目录,建立一个...

    计算机应用技术(实用手册)

    这里的IDE设备包括了IDE硬盘和IDE光驱,第一、第二组设备是指主板上的第一、第二根IDE数据线,一般来说靠近芯片的是第一组IDE设备,而主设备、从设备是指在一条IDE数据线上接的两个设备,大家知道每根数据线上可以接...

    Tcl_TK编程权威指南pdf

    使用花括号和双引号进行分组 过程 一个阶乘的例子 更多有关变量的知识 更多有关数学表达式的内容 注释 有关替换与分组的总结 要点 参考 第2章 开始使用 source命令 unix上的tcl脚本程序 .windows 95的...

    亮剑.NET深入体验与实战精要2

    4.7 无标题窗体拖动的两种方法 183 4.8 让程序只启动一次——单实例运行 184 4.9 实现系统托盘和热键呼出 185 4.10 进程与多线程的区别 190 4.11 创建多线程应用程序 191 4.12 WinForm开发常见问题 194 4.12.1 如何...

Global site tag (gtag.js) - Google Analytics