标签:
javascript使用原型链来解析属性值(很相似于使用作用域链来解析变量)
原型链是往"内部"找
作用域链是往“外部”找
使用Object.create()和工厂函数 取代 new(虽然现在new用的最多,大多数库源代码都是用new的方式来创建对象的,但毕竟javascirpt是原型继承,所以隐藏oop的new)
Object.create仅支持ie9+,
所以要做兼容性判断
var objectCreate = function(arg) { if(!arg) { return {};} function obj(){}; obj.prototype = arg; return new obj; } Object.create = Object.create || objectCreate ;//这是一种很常用的修复兼容性和检测库是否重复加载的方式
执行环境是函数被调用执行时才建立的,而作用域是根据代码结构来定去区分的,不管函数赋值到哪去,(可以大概认为定义函数时函数就在内存中的一段地址,变量都是引用,无法改变其地址,所以作用域都是一样的)
但执行环境一个特有的变量就是this,this是根据执行环境要确定它是指向那个对象。
执行环境执行过程大致分为两轮,
1:声明参数并赋值
2:声明局部变量但不赋值
3:声明函数并且赋值,但不执行(其优先级大于2)
//其中也有一点,函数也是对象,所以函数的某些定义对象也所以,例如作用域,准确来说我认为作用域是按对象来划分的
var me = (function() { var name = "jack", jjLength = 18; return { yetName: function() { console.log(name); }, yetJJ : function() { console.log(jjLength); } } })(); me.yetName();//jack
作为匿名自执行函数,执行完一次之后便结束,
里面的变量就永远都不会更新,除非你定义了set方法
还有一点很关键,函数和对象的赋值都是引用赋值,二基础变量是值传递。(也可以这样说,复杂数据类型是引用传递,基础数据类型是值传递)
这里代码可以解释:
var a = { bb : ‘3‘, cc : function() { console.log(this.bb); } } a.cc();//3 var b = a; var bbb = a.bb; b.bb = ‘2333‘; a.cc();//2333 console.log(bbb);//3
就我而言看了很多书,当讲起闭包的概念的时候,没几本书能彻底的解释,例如”闭包是让内部函数能访问外部函数的变量的特性还是xxxxbalabala“,反正都不懂
但我曾看到一个最好的解释是:
闭包是阻止javascirpt垃圾回收器将变量从内存中移除的方法,使得在创建变量的执行环境的外面能访问到该变量。(虽然我一直吐槽为何叫做“闭包”,暂时还不懂命名的意义)
标签:
原文地址:http://www.cnblogs.com/WJ-yellow/p/4381308.html