理解上下文与作用域

一直以来没有对上下文(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)

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

 

posted @ 2016-03-05 17:00  marunzhou  阅读(10167)  评论(1编辑  收藏  举报