• 理解上下文与作用域


    一直以来没有对上下文(context)的定义,总有些模糊,没有认真地总结过,听到这个词,会想到看过的“上下文是函数执行环境”,“上下文是this”,但真的让自己去解释还真说不上来,故趁今日有空总结温故一番,有什么错误的,还望大家提出!

    《javascript权威指南》里是第8章函数导读页里有这样介绍到:

    函数使用它们实参的值 来计算返回值,成为该函数调用表达式的值。除了实参之外,每次调用还会拥有另外一个值——本次调用的上下文——这就是this关键字的传值。

    如果函数挂载在一个对象上,作为对象的一个属性,就称它为对象的方法。当通过这个对象来调用函数时,该对象就是此次调用上下文(context),也就是该函数的this的值 。用于初始化一个新创建的对象的函数称为构造函数。

    写一段简单的代码理解这段话:

    //定义一个对象
    var
    context = { foo: "bar", func : function(){ console.log(this);//打印上下文 return this.foo; } };
    //当通过这个对象来调用函数时,该对象就是此次调用上下文(context),也就是该函数的this的值 context.func();

    控制台输出结果:

    this代码了该函数的上下文(context),即对象context本身;

    作用域:函数的执行依赖于变量作用域,这个作用域是在函数定义时决定的,而不是函数调用时决定的。

    因为没理解好这条规则,故前两天晚上看了篇文章的示例没能理解,一直想不通 T T

    示例:( 一直在想为什么第二个bar输出的是1,不是2 )

    function foo(){
        var x = 1;
        return function() { alert(x); }
    };
    
    var bar = foo();
    
    bar(); // 1
    var x = 2 ;
    bar(); // 1

    好吧,作用域在函数定义时决定的,现在明白了,原谅我的无知......

    接下来,来把头脑内混乱的 “上下文?作用域?上下文?作用域?” 再度区分下吧。

    上下文(context)->this->挂载着变量与函数的对象(object-base)

    作用域->函数定义时决定->作用于函数(function-base)

    两者一个基于对象一个基于函数。

  • 相关阅读:
    Envoy 源码分析--network L4 filter manager
    Envoy 源码分析--network
    Envoy 源码分析--buffer
    Envoy 源码分析--event
    kubeadm安装kubernetes-v1.13.1
    istio-opentracing链路追踪方案
    istio-mix介绍
    BLAKE及BLAKE2算法详解
    YIIMP矿池搭建
    NOMP矿池搭建
  • 原文地址:https://www.cnblogs.com/marunzhou/p/5244586.html
Copyright © 2020-2023  润新知