学习javascript的闭包,原型,和匿名函数之旅


Posted in Javascript onOctober 18, 2015

本文通过示例给大家介绍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

二 .>匿名函数

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

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

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

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

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

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

void function(){ console.log('void') } ();

三 .>关于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方法

extendClass.prototype = new baseClass();
var instance = new extendClass();
var baseinstance = new baseClass();
baseinstance.showMsg.call(instance);
obj1.func.call(obj);

以上内容是小编给大家分享的学习javascript的闭包,原型,和匿名函数之旅,希望对大家有用。

Javascript 相关文章推荐
JavaScript 自动完成脚本整理(33个)
Oct 20 Javascript
js chrome浏览器判断代码
Mar 28 Javascript
在多个页面使用同一个HTML片段《续》
Mar 04 Javascript
javascript object array方法使用详解
Dec 03 Javascript
在ASP.NET中使用JavaScript脚本的方法
Nov 12 Javascript
Jquery使用小技巧汇总
Dec 29 Javascript
清除js缓存的多种方法总结
Dec 09 Javascript
利用js编写网页进度条效果
Oct 08 Javascript
JavaScript模拟实现封装的三种方式及写法区别
Oct 27 Javascript
解决vue的变量在settimeout内部效果失效的问题
Aug 30 Javascript
React事件处理的机制及原理
Dec 03 Javascript
JavaScript面试中常考的字符串操作方法大全(包含ES6)
May 10 Javascript
Javascript中的数据类型之旅
Oct 18 #Javascript
谈谈JavaScript自定义回调函数
Oct 18 #Javascript
JS实现的网页背景闪电闪烁效果代码
Oct 17 #Javascript
JavaScript实现点击按钮切换网页背景色的方法
Oct 17 #Javascript
JavaScript实现的背景自动变色代码
Oct 17 #Javascript
jQuery实现有动画淡出效果的二级折叠菜单代码
Oct 17 #Javascript
利用jQuery和CSS将背景图片拉伸
Oct 16 #Javascript
You might like
Opcache导致php-fpm崩溃nginx返回502
2015/03/02 PHP
php线性表的入栈与出栈实例分析
2015/06/12 PHP
php实现的简易扫雷游戏实例
2015/07/09 PHP
微信接口生成带参数的二维码
2017/07/31 PHP
Laravel5.4框架使用socialite实现github登录的方法
2019/03/20 PHP
php查询内存信息操作示例
2019/05/09 PHP
js 发个判断字符串是否为符合标准的函数
2009/04/27 Javascript
JavaScript 组件之旅(三):用 Ant 构建组件
2009/10/28 Javascript
javascript使用prototype完成单继承
2014/12/24 Javascript
ES6中class类用法实例浅析
2017/04/06 Javascript
jQuery制作全屏宽度固定高度轮播图(实例讲解)
2017/07/08 jQuery
浅谈webpack组织模块的原理
2018/03/10 Javascript
微信小程序实现点赞、取消点赞功能
2018/11/02 Javascript
Koa日志中间件封装开发详解
2019/03/09 Javascript
使用pkg打包ThinkJS项目的方法步骤
2019/12/30 Javascript
VUE中V-IF条件判断改变元素的样式操作
2020/08/09 Javascript
JavaScript 防抖和节流遇见的奇怪问题及解决
2020/11/20 Javascript
[04:03]DOTA2肉山黑名单梦之声 风暴之灵中文配音鉴赏
2013/07/03 DOTA
[01:28:44]DOTA2-DPC中国联赛定级赛 RNG vs iG BO3第一场 1月10日
2021/03/11 DOTA
Python中利用函数装饰器实现备忘功能
2015/03/30 Python
深入理解Python对Json的解析
2017/02/14 Python
Python常用时间操作总结【取得当前时间、时间函数、应用等】
2017/05/11 Python
Python入门_浅谈数据结构的4种基本类型
2017/05/16 Python
Python实现的求解最小公倍数算法示例
2018/05/03 Python
python 按不同维度求和,最值,均值的实例
2018/06/28 Python
Python中低维数组填充高维数组的实现
2019/12/02 Python
详解appium自动化测试工具(monitor、uiautomatorviewer)
2021/01/27 Python
使用 css3 transform 属性来变换背景图的方法
2019/05/07 HTML / CSS
电子商务专业在校生实习自我鉴定
2013/09/29 职场文书
技校教师求职简历的自我评价
2013/10/20 职场文书
给护士表扬信
2014/01/19 职场文书
毕业欢送会致辞
2015/07/29 职场文书
2019大学竞选班长发言稿
2019/06/27 职场文书
基于Python实现的购物商城管理系统
2021/04/27 Python
Java并发编程之原子性-Atomic的使用
2022/03/16 Java/Android
SONY AN-LP1 短波有源天线放大器图
2022/04/05 无线电