总目录:通过一段代码学习javascript基础知识系列

注意:

为了便于执行和演示,建议使用chrome浏览器,按F12,然后按Esc(或手动选择)打开console,在console进行执行和演示。

由于代码中使用了console.log或dir方法,因此如果在ie中执行,请自行替换为alert或注释掉。

第三节 - ()()用法

在JS中,有一种特殊的写法,就是两个小括号,如下(代码一):

(function(){
console.log("执行");
})();

这段代码会在页面加载的时候直接执行,在控制台输出“执行”。

这段代码的等价代码为(代码二):

function Run(){
console.log("执行");
}
Run();

就是创建了一个函数,然后执行。代码一还有另外一种形式(代码三):

(function(){
console.log("执行");
}());

代码三和代码一的差别就在最后一对小括号写在里面或者外面,效果是一样的。

在上一节中,讲解了this的用法,而在()()和this同时出现时,如果不了解本质,我们可能还会分不清this的指向,

这里举几个例子说明this在()()中的判断。

下面这段代码(代码四)是在代码一的基础上增加了this.blog = "isea533"。

(function(){
this.blog = "isea533";
console.log("执行");
})();

这段代码执行之后,我们可以在console中输入blog查看,结果为“isea533",

这就说明了this是指向全局的。按照我们上一节的来讲,同时看这段代码的等价代码二,

我们可以知道这段代码其实就是作为函数执行的,所以this在这里就是window对象。

再看一种稍微复杂的情况(代码五):

function Five(){
var blog = "isea533";
this.blog = "isea";
(function(){
console.log(blog);
console.log(this.blog);
})();
}

对这段代码,有两种执行方式,一种作为函数执行,一种作为构造函数执行,这两种情况的结果是不一样的。

我们先按函数执行Five();

我们可以看到两个blog都输出了。我们再看另一种情况:

这里可以看到blog输出了,this.blog为undefined,这就说明了在Five对象中的()()方法里面,this仍然是指向全局的。

第一种情况的时候,应为Five()为函数执行,所以创建了全局变量blog,所以执行的时候能够输出Isea,

而第二种情况时,由于是构造函数,所以this.blog="isea"并没有执行,因而下面执行的时候,是没有定义的。

我们可以将Five方法按照代码二的形式进行改造,如下(代码六):

function Five(){
var blog = "isea533";
this.blog = "isea";
function run(){
console.log(blog);
console.log(this.blog);
}
run();
}

这里的run也是仅仅作为函数执行的,所以指向的是全局变量。

我们在看一种情况,当函数作为对象的方法执行的时候(代码七):

function Five(){
var blog = "isea533";
this.blog = "isea";
this.run = function(){
console.log(blog);
console.dir(this);
console.log(this.blog);
}
this.run();
}

当我们执行var f = new Five();时,输出结果如下图:

我在这儿用dir输出了this的结构,可以看到this指向的当前的对象,blog和this.blog都输出了,

这里的blog是局部对象,this.blog是当前对象的一个属性,所以都会正常输出。

看到这里,如果你还够清醒,我们继续往下看看两种简单的使用方式。

第一种,带参数的()(),如下代码(代码八):

(function(blog){
console.log("Hello "+blog);
})("isea533");

function有一个参数blog,我们在第二个括号 ()("isea533") 传入了参数。

第二种,带返回值的()(),如下代码(代码九):

var result = (function(blog){
var a = 4,
b = 6;
return a+b;
})();

这段代码执行后,result = 10;

第二种情况,在稍加复杂后,如下代码(代码十):

var result = (function(blog){
function Five(){
var blog = "isea533";
this.blog = "isea";
this.run = function(){
console.log(blog);
console.log(this.blog);
}
}
return new Five();
})();

返回的result为Five对象的实例。

上述内容为个人理解,如果有错误的地方,希望可以指正。

参考内容:

JavaScript 两个小括号 ()() 对执行上下文的影响

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

学习javascript基础知识系列第三节 - ()()用法的更多相关文章

  1. 学习javascript基础知识系列第二节 - this用法

    通过一段代码学习javascript基础知识系列 第二节 - this用法 this是面向对象语言中的一个重要概念,在JAVA,C#等大型语言中,this固定指向运行时的当前对象.但是在javascr ...

  2. JavaScript学习---JavaScript基础知识

    JavaScript的引入方式 JavaScript的引入方式: 1.直接在script里面写: 2.使用<script src="JS的文件位置"> {#1 直接编写 ...

  3. C# 基础知识系列- 9 字符串的更多用法(一)

    0. 前言 在前面的文章里简单介绍了一下字符串的相关内容,并没有涉及到更多的相关内容,这一篇将尝试讲解一下在实际开发工作中会遇到的字符串的很多操作. 1. 创建一个字符串 这部分介绍一下如何创建一个字 ...

  4. 一步步学习javascript基础篇(0):开篇索引

    索引: 一步步学习javascript基础篇(1):基本概念 一步步学习javascript基础篇(2):作用域和作用域链 一步步学习javascript基础篇(3):Object.Function等 ...

  5. 一步步学习javascript基础篇(3):Object、Function等引用类型

    我们在<一步步学习javascript基础篇(1):基本概念>中简单的介绍了五种基本数据类型Undefined.Null.Boolean.Number和String.今天我们主要介绍下复杂 ...

  6. Javascript基础知识总结一

    Javascript基础知识总结一 <!DOCTYPE html> <html> <head lang="en"> <meta chars ...

  7. 【javascript基础】系列

    这是本人记录的javascript基础知识,希望能给大家的学习带来一点帮助. [javascript基础]1.基本概念 [javascript基础]2.函数 [javascript基础]3.变量和作用 ...

  8. jQuery学习笔记 - 基础知识扫盲入门篇

    jQuery学习笔记 - 基础知识扫盲入门篇 2013-06-16 18:42 by 全新时代, 11 阅读, 0 评论, 收藏, 编辑 1.为什么要使用jQuery? 提供了强大的功能函数解决浏览器 ...

  9. 基础知识系列☞Abstract和Virtual→及相关知识

    转载地址→http://www.cnblogs.com/blsong/archive/2010/08/12/1798064.html 在C#的学习中,容易混淆virtual方法和abstract方法的 ...

随机推荐

  1. Address Book(地址薄)

    <?xml version="1.0" encoding="UTF-8"?> <?import javafx.scene.Scene?> ...

  2. php面向对象编程之构造方法__construct()

    php中构造方法是对象创建完成后第一个被对象自动调用的方法.在每个类中都有一个构造方法,如果没有显示地声明它,那么类中都会默认存在一个没有参数且内容为空的构造方法. 构造方法的作用 通常构造方法被用来 ...

  3. VMware vSphere 5.5的12个更新亮点(2)

    ACPI支持 以前版本的VMware虚拟机的局限性之一,是支持的虚拟设备数量甚少.vSphere 5.5引入了Virtual Hardware 10,这增加了基于SATA的虚拟设备节点,通过AHCI( ...

  4. java 图片 批量 压缩 +所有压缩

    /* oldsrc  : 原图片地址目录 如 'd:/'    newsrc  : 压缩后图片地址目录 如 'e:/'    widthdist,heightdist : 压缩后的宽和高       ...

  5. HDOJ 4937 Lucky Number

    当进制转换后所剩下的为数较少时(2位.3位),相应的base都比較大.能够用数学的方法计算出来. 预处理掉转换后位数为3位后,base就小于n的3次方了,能够暴力计算. . .. Lucky Numb ...

  6. Win32多线程编程(1) — 基础概念篇

      内核对象的基本概念 Windows系统是非开源的,它提供给我们的接口是用户模式的,即User-Mode API.当我们调用某个API时,需要从用户模式切换到内核模式的I/O System Serv ...

  7. 解决 Google 重定向,体验 Google 本味

    想要体验原汁原味的 Google(google.com),下面的方案是我用过的较方便的方案. 欢迎更正及补充 Chrome 扩展 Chrone 商店有一款禁止重定向的扩展 NoCountryRedir ...

  8. XMLHTTP请求的当前状态

    readyState,此属性只读,状态用长度为4的整型表示.定义如下: 0 (未初始化) 对象已建立,但是尚未初始化(尚未调用open方法) 1 (初始化) 对象已建立,尚未调用send方法 2 (发 ...

  9. 阿里云 RDS 怎么保证高可用性

    RDS在系统构建之初,从网络到硬件再到系统都是基于高可用设计,他可以做到故障30秒无缝转移,对应用完全透明. 当一个数据库实例发生故障时, 另一个会立即顶上,而且对应用是完全透明的.你无需变更应用的连 ...

  10. <经验杂谈>C#中一种最简单、最基本的反射(Reflection):通过反射获取方法函数

    说起反射之前和很多用C#/.net的同仁们一样,相比于一般应用层对数据的增删改查总有点觉得深奥到难以理解.其实程序这东西,用过.实践过就很简单,我一直这么认为. 先说下概念:反射 Reflection ...