1.新建对象,方法内变量作用域理解错误

        var md1 = {
count: 0,
add: function () {
count++;
},
sub: function () {
count--;
},
show: function () {
console.log(count);
}
}; md1.add();
md1.add();
md1.show();

在不加this的情况之下,会试图与当前对象的作用域内寻找count。如果硬要这样写,就必须加入一个全局变量(或者在上级作用域内有count)count,如下。

        var count = 100;
var md1 = {
count: 0,
add: function () {
count++;
},
sub: function () {
count--;
},
show: function () {
console.log(count);
}
}; md1.add();
md1.add();
md1.show();

当然,正确的方法是如下这样。

        var md1 = {
count: 0,
add: function () {
this.count++;
},
sub: function () {
this.count--;
},
show: function () {
console.log(this.count);
}
}; md1.add();
md1.add();
md1.show();

但是这样也不好,会暴露count这个理应是私有的成员,可直接在外部代码之中修改count,如下

        var md1 = {
count: 0,
add: function () {
this.count++;
},
sub: function () {
this.count--;
},
show: function () {
console.log(this.count);
}
}; md1.add();
md1.add();
md1.count = 100;
md1.sub();
md1.add();
md1.show();

2.立即执行函数式,这种方式可以屏蔽count

        var md1 = (function () {
var count = 0;
var add = function () {
count++;
};
var sub = function () {
count--;
};
var show = function () {
console.log(count);
};
return {
add: add,
sub: sub,
show: show
};
})(); md1.add();
md1.add();
md1.count = 100;
md1.sub();
md1.add();
md1.show();

3.放大模式,用于向已有模块里面添加新的公共成员

        var md1 = (function () {
var count = 0;
var add = function () {
count++;
};
var sub = function () {
count--;
};
var show = function () {
console.log(count);
};
return {
add: add,
sub: sub,
show: show
};
})(); var md2 = (function (md) {
md.add2 = function () {
md.add();
md.add();
};
return md;
})(md1); md1.add();
md1.add();
md1.sub();
md2.add2();
md1.show();
md2.show();

4.宽放大模式

        var md1 = (function () {
var count = 0;
var add = function () {
count++;
};
var sub = function () {
count--;
};
var show = function () {
console.log(count);
};
return {
add: add,
sub: sub,
show: show
};
})(); var md2 = (function (md) {
md.add2 = function () {
md.add();
md.add();
};
return md;
})(md1 || {}); md1.add();
md1.add();
md1.sub();
md2.add2();
md1.show();
md2.show();

独立性是模块的重要特点,模块内部最好不与程序的其他部分直接交互。

为了在模块内部调用全局变量,必须显式地将其他变量输入模块。

  var module1 = (function ($, YAHOO) {

    //...

  })(jQuery, YAHOO);

上面的module1模块需要使用jQuery库和YUI库,就把这两个库(其实是两个模块)当作参数输入module1。这样做除了保证模块的独立性,还使得模块之间的依赖关系变得明显。这方面更多的讨论,参见Ben Cherry的著名文章《JavaScript Module Pattern: In-Depth》

这个系列的第二部分,将讨论如何在浏览器环境组织不同的模块、管理模块之间的依赖性。

JavaScript立即执行函数学习的更多相关文章

  1. javaScript 立即执行函数学习笔记

    立即执行函数: 即执行函数(Immediate Functions),立即执行函数模式是一种语法,可以让你的函数在定义后立即被执行 立即执行函数(immediate function)术语不是在ECM ...

  2. javascript立即执行函数

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

  3. JavaScript 立即执行函数

    js中(function(){…})()立即执行函数写法理解 javascript和其他编程语言相比比较随意,所以javascript代码中充满各种奇葩的写法,有时雾里看花,当然,能理解各型各色的写法 ...

  4. javascript立即执行函数 (function(){})()

    看到一段代码: (function(){ var outer = $('#subject'); outer.find('li').on('mouseover', mouseover); })() ( ...

  5. (译)详解javascript立即执行函数表达式(IIFE)

    写在前面 这是一篇译文,原文:Immediately-Invoked Function Expression (IIFE) 原文是一篇很经典的讲解IIFE的文章,很适合收藏.本文虽然是译文,但是直译的 ...

  6. javascript自执行函数为什么要把windows作为参数传进去

    http://segmentfault.com/q/1010000000311686 (function (window, $, undefined) { play=function(){ $(&qu ...

  7. 详解javascript立即执行函数表达式(IIFE)

    立即执行函数,就是在定义函数的时候直接执行,这里不是申明函数而是一个函数表达式 1.问题 在javascript中,每一个函数在被调用的时候都会创建一个执行上下文,在函数内部定义的变量和函数只能在该函 ...

  8. Javascript 自动执行函数(立即调用函数)

    开头:各种原因总结一下javascript中的自动执行函数(立即调用函数)的一些方法,正文如下 在Javascript中,任何function在执行的时候都会创建一个执行上下文,因为function声 ...

  9. javascript立刻执行函数

    一般常见的立刻执行函数推荐如下两种: (function(a){ console.log(a); })("kk"); (function(a){ console.log(a) }( ...

随机推荐

  1. 获取访问IP

    public static String GetIP() { String ip = HttpContext.Current.Request.ServerVariables["HTTP_X_ ...

  2. zabbix 3.2.4 使用详解

    一:zabbix简介及原理 二:zabbix添加主机: /usr/share/zabbix/include/locales.inc.php   #这里为zabbix语言包路径‘zh_CN’ 为true ...

  3. 磁盘blk_update_request: I/O error

    https://www.cnblogs.com/chris-cp/p/6340289.html

  4. 2016-06-19 exshop第5天

    昨天对grails3和spring-security进行了全面的调研并进行了试验,试用下来发现grails3的启动速度.代码修改后刷新速度.内存占用以及架构的设计上更加合理,asset-pipelin ...

  5. x86 版的 Arduino Intel Galileo 开发板的体验、分析和应用

    1.前言 在今年(2013)罗马举办的首届欧洲 Make Faire 上,Intel 向对外发布了采用 x86 构架的 Arduino 开发板:Intel Galileo.这无疑是一个开源硬件领域的重 ...

  6. linux脚本实现scp命令自动输入密码和yes/no等确认信息

    实现方式: 通过expect工具实现 #!/bin/bash yum -y install expect expect -c " spawn scp -r root@192.168.10.1 ...

  7. RocketMQ 启动停止命令

    1.rocketmq的启动   进入rocketMQ解压目录下的bin文件夹 启动namesrv服务:nohup sh bin/mqnamesrv &  日志目录:{rocketMQ解压目录} ...

  8. solr配置IKAnalyzer抛出ClassNotFoundException

    这个问题搞了很久,在QQ群上问了很久,关键很气人的是我居然被群主给开了.我也是醉了.我不知道我哪里得罪了那个solr群的群主. 废话不多说.抛出的异常如下: 刚开始一直认为是没有找到类,也就相当于没找 ...

  9. Python3 序列解包

    转载自:https://blog.csdn.net/yilovexing/article/details/80576788 序列解包是 Python 3.0 之后才有的语法 什么是序列解包呢?先看一个 ...

  10. Uniform Generator

    Computer simulations often require random numbers. One way to generate pseudo-random numbers is via ...