一、作用域
1.其他语言:以代码块作为作用域
public void Func(){ if(1==1){ string name = "java"; } print("name"); } Func() //报错,因为参数name只是作用域为if结构内的局部变量2.python:以函数为作用域
情况一: def func(): if i==1: name="alex" print(name) func() //输出alex 情况二: def func(): if i==1: name="alex" print(name) func() //输出alex print(name) //报错,name只是作用域为func函数结构内的局部变量3.JavaScript:以函数为作用域
function func(){ if(1==1){ var name="alex"; } console.log(name); } func() //输出alex
二、JavaScript的作用域
1.以函数作为作用域
2.函数的作用域在函数未被调用之前就已经被创建了
3.函数的作用域存在作用域链,并且也是在被调用之前创建
xo="alex"; function func(){ var xo="eric"; function inner(){ console.log(xo); } return inner; } var ret=func(); ret(); //输出eric xo="alex"; function func(){ var xo="eric"; function inner(){ console.log(xo); } var xo="tony"; return inner; } var ret=func(); ret(); //输出tony
4.函数内部局部变量提前声明,但是其亦遵循顺序执行
function func(){ console.log(xxoo); var xxoo="alex"; //解释过程中: var xxoo; } func(); //输出为undefined,说明内部变量已被提前声明,同时其亦遵循顺序执行
三、面向对象
1.JS中的对象创建
function Foo(n){ //用函数的方式创建“类” this.name = n; this.sayName = function(){ console.log(this.name); } } var obj1 = new Foo("we"); obj1.sayName(); var obj=new Foo("wee"); obj2.sayName();
2.原型
上段(三、1)中的代码比较占用空间,因为由(二、2)可知每个对象都会封存属于自己的sayName。为了节约存储空间,可以使用原型。
function Foo(n){ this.name = n; } #以下即在为Foo构建原型 Foo.prototype={ "sayName":function(){ console.log(this.name); } } obj1 = new Foo("we"); obj1.sayName(); obj2=new Foo("wee");