加入收藏 | 设为首页 | 会员中心 | 我要投稿 汽车网 (https://www.0577qiche.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 教程 > 正文

作用域解析

发布时间:2023-03-13 08:41:43 所属栏目:教程 来源:
导读:作用域即代码片段的有效范围,这里的代码片段可以是一个函数、一个变量等。

在 JavaScript 中,通常被拿来讨论的是 全局作用域 和 函数作用域。

1. 全局作用域
在全局环境下定义的变量、函数,都属于全局作用
作用域即代码片段的有效范围,这里的代码片段可以是一个函数、一个变量等。

在 JavaScript 中,通常被拿来讨论的是 全局作用域 和 函数作用域。

1. 全局作用域
在全局环境下定义的变量、函数,都属于全局作用域的范围,也就是这些变量、函数在任何地方都能被访问。

var number = ;
var fn = function() {
  console.log('我是一个全局下的函数');
  console.log('访问全局下的 number: ', number);
};
fn();

全局的作用域很好理解,即全局下的变量、函数在任何地方都能被访问到。

在 ES6 的模块化规范中,一个模块就是一个 js 文件,所以如果在 ES6 的模块的最顶层声明变量和函数,是不属于全局的。

2. 函数作用域
函数拥有自己的作用域,也就是说函数内声明的变量和函数,只在函数内有效。

var fn = function() {
  var innerFn = function() {
    console.log('我是函数内的函数');
  };
  var str = '我是函数内的变量';
  innerFn();
  console.log(str);
};
fn();
console.log(str); // 输出:ReferenceError: str is not defined

函数内的变量 str 在函数外部无法访问到,因为其所在的作用域是函数 fn 的作用域,所以只在 fn 函数内能被访问。

3. eval 的作用域
eval 根据调用的方式,其作用域也会发生变化。

如果直接调用 eval 则其作用域就是当前上下文中的作用域。如果间接性质的调用,比如通过一个 eval 的引用来调用,那作用域就是全局的。

var storeEval = eval;
(function() {
  storeEval('var number1 = 1;');
  eval('var number2 = 2');
  console.log('自执行匿名函数内输出:', number2);
})();
console.log(number1); // 输出:1
console.log(number2); // 输出:ReferenceError: number2 is not defined

本身 eval 用到的情况就少,所以这种情况下做个了解即可。

4. 作用域链
理解了作用域,作用域链就很好理解了。

通常情况下,内层作用域拥有访问上层作用域的能力,而外层无法访问到内层的作用域。

var number = ;
var fn = function() {
  console.log(number);
  var str = '字符串';
};
fn();
console.log(str); // 输出:ReferenceError: str is not defined
由此可见作用域从内往外的。

var number1 = ;
var fn1 = function() {
  var number2 = ;
  var fn2 = function() {
    var number3 = ;
    var fn3 = function() {
      console.log('fn3 内的输出:');
      console.log(number1);
      console.log(number2);
      console.log(number3);
    }
    fn3();
  };
  fn2();
}
fn1();

例子中的 fn3 就具有访问 fn2作用域、fn1作用域、全局作用域的能力。

这样从内往外就形成了一条作用域链。

5. 利用函数作用域进行封装
函数作用域最常用的场景之一就是隔离作用域。

因为函数有自己的作用域,所以很多库、框架在实现的时候都会把内容写在一个函数中。

(function() {
  var config = {};
  var fn = function() {
    // ...
  };
  window.$ = fn;
  window.jQuery = fn;
})();
这样就不会污染到全局,只对外暴露想要暴露的部分。

(编辑:汽车网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章