作用域

定义
变量起作用的范围就是变量的作用域。

JS中没有块级作用域。且唯一能产生作用域的东西是函数!所以,我们在声明变量时,全局代码要在代码前端声明,函数中要在函数体一开始就声明好。除了这两个地方,其他地方都不要出现变量声明。而且建议用“单var”形式。

词法作用域
就是在代码写好的那一刻,变量的作用域就已经确定了,这种作用域,就是所谓的词法作用域。
规则

1. 函数允许访问函数外的数据
2. 整个代码结构中只有函数可以限定作用域
3. 作用域规则首先使用提升规则分析
4. 如果当前作用域中有了该变量,就不考虑外面的同名变量。

变量和函数提升
1. js代码在预解析阶段,会对以var声明的变量名,和function开头的语句块,进行提升操作,提升到它所在作用域的最开始的部分。
2. 函数同名,如何提升
预处理的时候,会将两个函数全部提升,但是后面的函数会覆盖掉前面的函数。
3.变量和函数同名
在提升的时候,如果有变量和函数同名,会忽略掉变量,只提升函数。
4.变量的提升是分作用域的。例如
var num = 456;
function test(){
var num = 10;
console.log(num); //结果为10
}
test();

5.函数表达式是不会被提升的。
再列举几个小练习加深了解。
var num = 456;
function f1() {
console.log(num); //结果为456
num = 10;
}
f1();
console.log(num); //结果为10

   function Foo() {
      getName = function(){ alert(1); };
       return this;
   }

    Foo.getName = function() { alert(2); };
    Foo.prototype.getName = function(){ alert(3); };
    var getName = function() { alert(4); };
    function getName(){ alert(5); }

   Foo.getName(); //   alert 2
   getName(); //  4
   Foo().getName(); //  1
   getName(); //1
   new Foo.getName(); //  2
   new Foo().getName(); // 3

注意点
js中没有带var关键字的变量都是隐式全局变量。所以并不是在函数内部写了变量,这个变量就属于这个函数的作用域,而是必须使用var来声明变量,这个变量才属于这个作用域。

作用域链
只要是函数就可以创造作用域,函数中又可以再创建函数,函数内部的作用域可以访问函数外部的作用域,如果有多个函数嵌套,那么就会构成一个链式访问结构,这就是作用域链。

变量的搜索原则
在使用变量的时候首先在所在的作用域中查找,找到了直接使用,如果没有就去上级作用域中查找,重复以上步骤,如果直到0级作用域链也就是全局作用域还没找到就报错。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值