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()