zoukankan      html  css  js  c++  java
  • Js基础(二) 作用域链与闭包相关

    1、执行上下文

    在一段script 或者一个函数作用域中 都会生成一个执行上下文

    在全局执行上下文中 js会将 变量 与 函数声明提取出来

    在函数执行上下文中 在函数执行之前 会将函数内的变量定义 函数声明 this arguments 提取出来

     2、this指向

    作为构造函数执行

    作为对象属性执行

    普通函数执行

    call apply bind 方式执行

    this只有在执行时才会改变指针 定义时this不会指向任何对象 js是解释型语言不是定义型

    3、作用域链

    函数作用域链与this恰恰相反 this是只有在执行时候确认 而作用域链是函数在定义时就已经确定了

    自由变量 当前函数没有定义的变量叫做自由变量 官方解释: 闭包(Closure)是词法闭包(Lexical Closure)的简称,是引用了自由变量的函数。这个被引用的自由变量将和这个函数一同存在,即使已经离开了创造它的环境也不例外 上一段代码解释闭包

        <script>
            function fn1(){
                var a = 10
                return function(){
                    return a
                }
            }
            var a = 100
            var fn = fn1()
            console.log(fn)
            console.log(fn())
            
        </script>

    上面输出结果是10 也就是说 函数定义的时候其作用域链就已经固定 并且 函数定义时 它的作用域和引用的自由变量就已经固定 无论这个函数 在任何位置引用 调用它内部的自有变量都不会再改变了 理论上说任何一个函数都是一个闭包 那么闭包主要的应用场景就是 保护变量 返回函数 传入函数

            function fn1(){
                var a = 10
                return function(){
                    return a
                }
            }
    
            var fn = fn1()
    
            function fn2 (fn){
                var a = 1000
                console.log(fn())
            }
    
            fn2(fn)

    输出结果仍然是10 无论任何环境闭包的作用域和自由变量都已经定死了 下面举两个简单的闭包案例

        <script>
            for(var i = 0; i < 10 ; i++){
                (function(i){
                var a = document.createElement('a')
                a.innerHTML = i + '<br/>'
                a.onclick = function(){
                    alert(i)
                }
                document.body.appendChild(a)
                })(i)
    
            }
        </script>

    上面每次执行我们都创建了一个独立的自执行函数 然后将 i 传入 这个时候自执行函数会将 i 变量固定的保存下来 下面举一个变量权限的例子

            function firstIndex(){
                var _list = []
                return function(id){
                    if(_list.indexOf(id) >= 0 ){
                        return false
                    }else{
                        _list.push(id)
                        return true
                    }
                }
            }
            var fn = firstIndex()
            console.log(fn(10))
            console.log(fn(10))
            console.log(fn(20))
  • 相关阅读:
    违反了引用完整性约束。Dependent Role 具有多个具有不同值的主体。S级乌龙,自己制造的笑话
    用MVC5+EF6+WebApi 做一个小功能(二) 项目需求整理
    用MVC5+EF6+WebApi 做一个小功能(四) 项目分层功能以及文件夹命名
    用MVC5+EF6+WebApi 做一个小功能(三) 项目搭建
    ASP.NET WebApi总结之自定义权限验证
    用MVC5+EF6+WebApi 做一个小功能(一)开场挖坑,在线答题系统
    Javascript 535种方式!!!实现页面重载
    MVC页面移除HTTP Header中服务器信息
    为什么JavaScript要有null?(翻译)
    可编程渲染管线与着色器语言
  • 原文地址:https://www.cnblogs.com/tengx/p/9016963.html
Copyright © 2011-2022 走看看