zoukankan      html  css  js  c++  java
  • js中的作用域与作用域链

    作用域与作用域链

    作用域

    作用域简单来说就是: 变量或函数在哪些范围内可以用,而在其他部分要用就得重新定义

    作用域与this指向的状态是不一样的:

    • 作用域的范围是静态的,在代码编写的时候就已经确定
    • this的指向则是动态的,随着调用对象的不同而改变

    作用域与执行上下文的不同

    • 作用域是静态的,代码编写好后,作用域就被确定,不再变化
    • 执行上下文会在函数调用前产生,调用结束后被释放,尤其指的是函数执行上下文
    • 执行上下文是从属与当前的作用域中的

    作用域的分类:

    • 全局作用域
    • 函数作用域
    • 块级作用域(ES6以后拥有)

    从一道题目弄清作用域个数的计算,及执行上下文是从属与当前的作用域中是什么意思:

    var a = 10
    var b = 20
    
    function func(x){
        var a = 100
        var c = 300
        console.log('fn()', a, b, c, x) //
        
        function bar(x){
            var a = 1000
            var d = 400
            console.log('bar()', a, b, c, d, x)
        }
        bar(100)
        bar(200)
    }
    func(10)
    

    作用域链

    作用域链的概念十分简单: 从当前作用域向上出发,到全局作用域为止,去寻找变量,能够找到就返回其变量值, 找不到就报错

    var a = 123
    
    function test () {
        var a = 10
    
        console.log(a)
        console.log(b)  // 报错: b is not defined
    }
    test()
    

    最后来几道面试题,给大家巩固一下作用域与作用域链的知识

    // 面试题1
    var x = 10
    function func() {
        console.log(x)
    }
    function show(f) {
        var x = 20
        f()
    }
    show(func)  // 猜猜结果是啥
    
    
    
    // 面试题2
    var fn = function () {
        console.log(fn)
    }
    fn()  // 猜猜结果是啥
    
    var obj = {
        fn2: function () {
            console.log(fn2)
        }
    }
    obj.fn2()   // 猜猜结果是啥
    

    答案是
    10
    fn函数对象
    报错: fn2 is not define

    第一题,考查的是: 作用域链是静态的,在代码编写的时候就已经确定,并且不再改变(代码改变,会改)

    第二题,考查的是: 在作用域链中查找变量

    第三题, 考查的还是在作用域链中查找变量,但是增加了迷惑性

  • 相关阅读:
    mysql 加入列,改动列,删除列。
    C语言中的static 具体分析
    [Python网络编程]gevent httpclient以及网页编码
    iOS学习之 plist文件的读写
    数据库设计中的14个技巧
    最简单的基于FFMPEG的封装格式转换器(无编解码)
    一次重要的爱情婚姻抉择,您怎么看?
    2014年到期的myeclipse5.5.1注冊码
    24点经典算法
    使用val()方法设置表单中的默认选中项
  • 原文地址:https://www.cnblogs.com/fitzlovecode/p/jsadvanced8.html
Copyright © 2011-2022 走看看