理解javascript的闭包,原型,和匿名函数(自己总结)

一 .>关于闭包

理解闭包 需要的知识
1.变量的作用域

例1:
var n =99; //建立函数外的全局变量
function readA(){
alert(n); //读取全局变量
}
readA(); //执行此函数
例2:
function readB(){
var c = 9;
function readC(){
console.log(c); //ok c可见
}
return readC;
}
alert(c); //error c is not defined.

note:  函数内部声明变量c时,一定要加上 var,否则 c会成为一个全局变量

所以函数内可见全局变量,函数内的局部变量却对外不可见
js的作用域是链式的,父对象里的变量总对子对象可见,子对象的对象却对父对象不可见
当我们要获取函数内的内部变量

于是有了例3:

function readB(){
var c = 9;
function readC(){
console.log(c);
}
return readC();
}
readB();

闭包很类似基于此做了一个变式

function readB(){
var c = 9;
function readC(){
console.log(c);
}
return readC;
}
var res = readB();
res();

note:
1.慎用闭包,注意内存占用,因为它会保存父函数的状态
2.不要随便改变父函数内部变量的值

理解闭包
   note: this 指包含它的函数被执行时所属的对象

例1:
var name = "The Window"; var object = {
name : "My Object",   getNameFunc : function(){ //此时this (这个执行函数)是属于object对象的,是object对象下的一个属性的值
   return function(){ //此时this (这个执行函数)是一个匿名函数,从根对象window生成,是属于window
     return this.name;
    };
  }
};
console.log(object.getNameFunc()()); //the window
例2:
var name = "The Window"; var object = {
name : "My Object", getNameFunc : function(){
var that = this;
  return function(){
   return that.name;
  }; }
};
console.log(object.getNameFunc()()); //My Object

二 .>匿名函数 IIFE
直接定义一个匿名函数 然后调用这个匿名函数,这种形式在jquery插件的定义时很常见

1.通过函数字母量的方式. 先声明一个匿名函数,然后执行它

( function(){
console.log('excute self');
}) ();

2.通过优先表达式的方式 , 由于Javascript执行表达式是从圆括号里面到外面,所以可以用圆括号强制执行声明的函数

(
function () {
alert(2);
}
()
);

3.void操作符 用void操作符去执行一个没有用圆括号包围的一个单独操作数

void function(){ console.log('void') } ();
在Bootstrap源码(具体请看《Bootstrap源码解析》)和其他jQuery插件经常看到如下的写法:
Js代码 +function ($) { }(window.jQuery); 这种写法称为:
IIFE (Imdiately Invoked Function Expression 立即执行的函数表达式) 一步步来分析这种代码:
先弄清 函数表达式(function expression)和 函数声明(function declaration)的区别: 函数表达式 Function Expression - var test = function() {};
函数申明 Function Declaration - function test() {}; 函数表达式中的函数可以为匿名函数,也可以有函数名,但是该函数实际上不能直接使用,只能通过表达式左边的变量 a 来调用
var a = function(){
alert('Function expression');
}
var b = new a(); 函数声明时必须有函数名
function a(){
alert('Function declaration');
}
a(); 这是一个匿名函数
function () { }
你也许注意到匿名函数在console下会报错。console的执行和报错如下:
function(){}
SyntaxError: Unexpected token ( 通过一元操作符+变成了函数表达式。
也可以使用 - ~ !等其他一元运算符或者括号,目的是为了引导解析器,指明运算符附近是一个表达式。以下是三种经典方式 :
+function () { }; (function () { }); void function() { }; 函数表达式通过 末尾的() 来调用并运行。就是一个IIFE
+function () { }(); (funtion () { })();

参考:http://suqing.iteye.com/blog/1981591/

三 .>关于prototype

原型 prototype

理解js中的protitype首先需要明白js的面向对象设计

function People(name){
this.name = name; console.log(this); //Window 或者 object { name: 'xxx' }
this.introduce = function(){ //实例对象方法
console.log(this.name);
}
} new People('leon').introduce(); //这里有一个非常有趣的现象,结合前面的来看的话,
//首先function people里的this指向的默认是Window对象
//当 调用 People();时 this 输出为 Window对象
//但一旦调用new People('xx')时, this 输出为 {name:'xx'}
//其实也很好理解,一旦new ,便新建了一个对象

实例对象方法只能这样 new People('leon').introduce(); 调用 因为它使用前必须初始化

类的对象的静态方法

var People = {};  //等于一个对象 {} 或者 function 数组都可以 此时People需要是引用类型
People.sayhi = function(to_who){
console.log('hi '+ to_who);
} People.sayhi('lee'); //调用时这样调用

原型方法

var People = function(){};             // People 必须为一个 function(){} 即为一个类,不能是对象或值类型或其他引用类型
People.prototype.meet = function(meet_who) {
console.log('I am '+this.name + ',going to meet ' + meet_who);
}; new People('lee').meet('xx');

原型方法只能由该类的对象 调用
 A.prototype = new B(); 
原型看起来很像继承,但其实不是,它更像clone更准确
如果出现了父类和子类出现了重名的属性,采取就近原则,如果找不到一级一级向上找,如果要指定调用上级的属性,使用call方法

function baseClass()
{
this.showMsg = function()
{
alert("baseClass::showMsg");
}
} function extendClass()
{
} extendClass.prototype = new baseClass();
var instance = new extendClass();
instance.showMsg(); // 显示baseClass::showMsg

extendClass.prototype = new baseClass();
var instance = new extendClass();

var baseinstance = new baseClass();
baseinstance.showMsg.call(instance);

obj1.func.call(obj);

理解javascript的闭包,原型,和匿名函数及IIFE的更多相关文章

  1. Javascript闭包和C#匿名函数对比分析

    C#中引入匿名函数,多少都是受到Javascript的闭包语法和面向函数编程语言的影响.人们发现,在表达式中直接编写函数代码是一种普遍存在的需求,这种语法将比那种必须在某个特定地方定义函数的方式灵活和 ...

  2. 深入理解JavaScript的闭包特性如何给循环中的对象添加事件

    初学者经常碰到的,即获取HTML元素集合,循环给元素添加事件.在事件响应函数中(event handler)获取对应的索引.但每次获取的都是最后一次循环的索引.原因是初学者并未理解JavaScript ...

  3. 深入理解javascript的闭包

    闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现. 一.变量的作用域 要理解闭包,首先必须理解Javascript特殊的变量作用域. 变量的作用域 ...

  4. 理解Javascript 的闭包(closure)

    要理解闭包的概念先从变量的作用域说去 一.变量的作用域 要理解闭包,首先必须理解Javascript特殊的变量作用域. 变量的作用域无非就是两种:全局变量和局部变量. Javascript语言的特殊之 ...

  5. 如何给循环中的对象添加事件--深入理解JavaScript的闭包特性

    初学者经常碰到的,即获取HTML元素集合,循环给元素添加事件.在事件响应函数中(event handler)获取对应的索引.但每次获取的都是最后一次循环的索引.原因是初学者并未理解JavaScript ...

  6. 深入理解JavaScript的闭包特性 如何给循环中的对象添加事件(转载)

    原文参考:http://blog.csdn.net/gaoshanwudi/article/details/7355794 初学者经常碰到的,即获取HTML元素集合,循环给元素添加事件.在事件响应函数 ...

  7. 闭包(Closure)和匿名函数(Anonymous function)/lambda表达式的区别

    闭包(Closure)和匿名函数(Anonymous function)/lambda表达式的区别 函数最常见的形式是具名函数(named function): function foo(){ con ...

  8. js循环函数中的匿名函数和闭包问题(匿名函数要用循环中变量的问题)

    js循环函数中的匿名函数和闭包问题(匿名函数要用循环中变量的问题) 一.总结 需要好好看下面代码 本质是因为匿名函数用到了循环中的变量,而普通方式访问的话,匿名函数的访问在循环之后,所以得到的i是循环 ...

  9. 深入理解JavaScript系列(15):函数(Functions)

    介绍 本章节我们要着重介绍的是一个非常常见的ECMAScript对象——函数(function),我们将详细讲解一下各种类型的函数是如何影响上下文的变量对象以及每个函数的作用域链都包含什么,以及回答诸 ...

随机推荐

  1. 前端调试vConsole

    在移动端开发的时候,有时候需要真机调试的时候,没法看到console输出的信息,所以就有这个vConsole的开源插件 很方便就可以查看console输出的信息. 官方地址:https://www.n ...

  2. java 二进制、位运算、和移位运算符(2013-07-30-bd 写的日志迁移

    二进制是逢2进位的进位制,0.1是基本算符, 1字节=8位 比如 int a =1 ;int 占4个字节在计算机里表示为: java中的4个位运算,分别是“按位与&.按位或|.按位异或^,按位 ...

  3. MLT教程:从BXL文件导入Altium Designer原理图封装和PCB封装

    在TI官网的封装文件中提供弄BXL文件可以导出Altium Designer的封装库和原理图库. 这个界面往下面拉会看到: 然后可以下载各种封装的bxl文件了.下面视频说明bxl文件如何导出成功. 如 ...

  4. 013---Django的分页器

    知识预览 分页 Django的分页器(paginator) view from django.shortcuts import render, HttpResponsefrom app01.model ...

  5. java程序——凯撒加密

    古罗马皇帝凯撒在打仗时曾经使用过以下方法加密军事情报: 请编写一个程序,使用上述算法加密或解密用户输入的英文字串要求设计思想.程序流程图.源代码.结果截图.   设计思想:输入一个字符串,然后将其中每 ...

  6. css3心形 perspective transform

    CSS3挺有趣的,能实现不少动画,以下为娱乐内容 <!DOCTYPE html> <html> <head> <meta charset="UTF- ...

  7. 支付宝sdk 支付订单查询失败

    最近遇到了一些问题,厂商给我们反馈了一个问题,就是支付宝支付成功之后,旋转屏幕,订单查询失败.后来我怀疑是支付宝的问题,想都不用想是支付宝的问题. 但是自己根本你无法复现,因为我发现支付宝支付完成之后 ...

  8. android studio 首字母提示 设置 大小写敏感

    在使用Android studo 编写程序时, 刚开始,关键字提示 首字母 设置了 大小写敏感,小写字母只能提示小写字母开头的,大写字母只能提示大写字母开始的,比较麻烦,在网上搜了下,解决办法如下: ...

  9. IIS相关服务和无法启动服务W3SVC错误提示

    首先,打开“服务”查看下面的服务是否启动.(下面的两个服务就是跟IIS相关的服务,计算机(右键)->管理->服务和应用程序->服务) Windows Process Activati ...

  10. DOS程序员手册(七)

    第11章      中断处理程序 本章将深入到DOS系统内部探讨中断处理程序的内容.与其他计算机编程不一样, 中断处理程序这个名词听起来就很难懂.用最简单的话来说,中断处理程序就是对应于中 断激活的程 ...