Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

作用域分类 #6

Open
YBFACC opened this issue Jun 1, 2020 · 0 comments
Open

作用域分类 #6

YBFACC opened this issue Jun 1, 2020 · 0 comments

Comments

@YBFACC
Copy link
Owner

YBFACC commented Jun 1, 2020

作用域分类

全局作用域

在浏览器中是window

在node中是global

全局作用域中挂载着一切预设的内置对象

显式声明

var a = { name: '1' }
console.log(a)//已经挂载在全局变量上

隐式声明

function name(params) {
  var a = { name: '1' }
  b = a
}
name()
console.log(b)//已经挂载在全局变量上

函数作用域

每一个函数执行时,都会产生一个函数作用域

外部不能直接访问函数作用域中的变量(可以实现私有变量)

function A() {
  var a = '函数内部'
  console.log(a)//'函数内部'
}
A()
console.log(a)//报错

块级作用域

什么是块级作用域?

由{}封闭的代码块,👇拿java举个例子

if (true){
   int a1=11;
}
System.out.print((a1));//报错

老前辈var就不会形成块级作用域(因为var会变量提升)

经典老例子

for(var i = 0; i < 5; i++) {
  setTimeout(function() {
     console.log(i);			// 5 5 5 5 5
  }, 200);
};

es6中的let和const声明时就会绑定在最近的作用域上(包含块级)

for (let i = 0; i < 5; i++) {
  setTimeout(function () {
    console.log(i) // 0 1 2 3 4
  }, 200)
}

词法(静态)作用域

静态作用域:函数的作用域在函数定义的时候就决定了

动态作用域:函数的作用域是在函数调用的时候才决定

function foo(){
    console.log(a);
}

function bar(){
    var a = 3;
    foo();
}

var a = 2;

bar();//答案是?

如果这里输出的是2,则是静态作用域。输出3就是动态作用域

js是静态作用域,所以输出2(bash 是动态作用域)

[[scope]]属性

我们可以看到函数声明时,作用域已经确定

参考

《JavaScript高级程序设计》

谈谈 JavaScript 的作用域

《JavaScript忍者秘籍(第2版)》

JavaScript深入之词法作用域和动态作用域

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

1 participant