JavaScript-作用域问题

javascript进阶

作用域

1.JavaScript以函数为作用域(除let以外)
2.函数的作用域在函数未被调用之前,已经创建
3.函数的作用域存在作用域链,并且也是在被调用之前创建

示例一:

xo="alex";
function func(){
    var xo=' eric'; 
    function inner(){
    var xo=' tony';  
        console.log(xo); 
    }
    inner()
}
func()

这段代码中,xo首先被赋予了全局变量值“alex”,接着在func函数中,局部变量值eric又覆盖了全局变量alex,同样在函数inner中,tony覆盖了eric,因此最后得到的值为tony

示例二:

xo="alex"; 
function func(){
    var xo=' eric'; 
    function inner(){
        console.1og(xo);
    }
    return inner;
}

var ret=func()
ret()

这段代码中,返回了函数inner(),在调用此函数之前,已经生成了作用域链,因为inner没有xo,向上追溯,xo=eric得到的最后结果即为eric

示例三:

xo="alex"; 
function func(){
    var xo=' eric'; 
    function inner(){
        console.1og(xo);
    }
    var xo='tony';
    return inner;
}

var ret=func()
ret()

这段代码中,在解释器解释时,只创建作用域链,不执行,因此在创建作用域链时,xo在被赋值eric之后,跳过执行函数innner,又被赋予了tony,所以在调用函数时,向上追溯xo值是tony,最后得到的值为tony

4.函数内部局部变量自动提前声明

function func(){
    console.1og(xxoo);
}
func();
//程序直接报错

function func(){
    console.1og(xxoo);
    var xxoo='alex';
}
func();
//undefifed

在解释器解释时,会自动找的函数内部的每一个变量,并提前对该变量进行声明,但是不赋值

JavaScript面向对象

function foo(n){
    this.name=n;
}

var obj=new foo('kfc');

obj.named的值即为kfc
a.this代指对象
b.创建对象时,new函数()

function Foo(n){
    this.name=n;
    this.sayName=function(){
        console. log(this. name);
    }
}
var obj1=new Foo('we'); 
obj1.name 
obj1.sayName()
    
var obj2=new Foo('wee'); 
obj2.name 
obj2.sayName()

在这段代码执行时,在每次使用new函数时,都重复定义了Foo中的function函数方法,这是不合理的,应该有一种方法能够让我们只定义一次,之后调用即可,这就涉及到了原型

原型

上述代码就可改写成:

func Foo(n){
        this.name=n;
    }
    //Foo的原型
    Foo. prototype={
        'sayName': function(){
            console. log(this. name)
        }
    }
    obj1=new Foo(' we'); 
    obj1.sayName()
        
    obj2=new Foo(' wee');
    obj2.sayName()

猜你喜欢

转载自blog.csdn.net/yanhingwei/article/details/89846479