js 高级编程

  • 链式作用域

变量的作用域是整个函数,不是代码块

变量不可以被声明函数外部的程序引用,可以被声明函数内部的函数引用。

 

开发

声明函数内部一个变量不管声明在什么地方,函数内部都可以访问到。

声明函数内部一个变量不管声明在什么地方,函数内部子函数都可以访问到。

运行

声明函数运行一次,会产生一个变量放到内存中。运行完成如果内部函数对象被保留到外部,并且内部函数可能在运行时依赖该变量,则该变量一直留存在内存中。

声明函数再运行一次,会再产生一个变量放到内存中。当然也会再产生一些内部函数被保留到外部。这些变量,函数和上面的不是同一批。

 

  • 闭包

就是声明函数的内部定义了变量,并且内部有函数引用了变量,并且内部函数会被保留到外部。

那么一次声明函数的运行,就产生了一套闭包的环境。函数对象主要是函数的职责,当然它也是对象,但不建议给这个对象赋属性,方法等其他职责,以免混乱。

函数对象主要应该是运行,是产生一个空对象或用另一个对象充当this,来执行内部逻辑。

函数对象

执行函数的this对象

执行函数的返回值对象

闭包环境

这四个不是一个环境。闭包的函数操作的变量,不是那个this对象的,也不是函数对象的,也不是函数对象的返回值对象,而是闭包环境中内存中一个独立的变量。

验证

function f1(){

    var n=999;

    nAdd=function(){n+=1}

    function f2(){

      alert(n);

    }

    return f2;

  }

 

var ff2 = f1();

var fff2 = f1();

 

ff2();//999

nAdd();

ff2();//999

fff2();//1000

 

f1.n//undefined

var o1 = {};

f1.call(o1);

o1.n//undefined

 

  • 原型链

java是类继承,开发期,运行期类创建了一个对象就把类和所有父类的属性包括了。

js有原型链机制,运行期先创建上层对象,有自己属性和方法。然后定义函数通过prototype指向该上层对象,这样该函数创建的所有新对象都通过__proto__指向该上层对象。新对象有自己的属性和方法。应用新对象时可以使用新对象的,也可以使用上层对象的属性和方法。

f1 = function(){}

f1.prototype --> f1.prototype

f1 build new f1()

 

f1.prototype

constructor --> f1

__proto__ --> Object.prototype

 

new f1();

_proto_ --> f1.prototype

 

----------------------------------------

 

Object

Object.prototype --> Object.prototype

Object build {}

 

Object.prototype

constructor --> Object

__proto__ --> null

 

{}

__proto__ --> Object.prototype

 

---------------------------------------

 

Function

Function.prototype --> function(){}

Function build f1

 

function(){}

constructor --> Function

__proto__ --> Object.prototype

 

f1

__proto__ --> function(){}

 

 

  • 函数执行

代码词法分析

ActiveObject

补充属性

参数中出现过的属性

局部变量中出现过的属性

成员方法会覆盖成员变量

成员变量不会覆盖成员方法

然后从第一句开始执行代码

 

  • 值传递

基本类型是值传递

引用类型值是地址,也是值传递

猜你喜欢

转载自jshxwork.iteye.com/blog/2379742
今日推荐