参考:http://www.jb51.net/article/44182.htm
1.作用域是基于函数(function-based)而上下文是基于对象(object-based)。换句话说,作用域是和每次函数调用时变量的访问有关,并且每次调用都是独立的。上下文总是关键字 this 的值,是调用当前可执行代码的对象的引用。
变量作用域
变量能够被定义在局部或者全局作用域,这导致运行时变量的访问来自不同的作用域。全局变量需被声明在函数体外,在整个运行过程中都存在,能在任何作用域中访问和修改。局部变量仅在函数体内定义,并且每次函数调用都有不同的作用域。这主题是仅在调用中的赋值,求值和对值的操作,不能访问作用域之外的值。
"this" 上下文
上下文通常是取决于一个函数如何被调用。当函数作为对象的方法被调用时,this 被设置为调用方法的对象:
var object = {
foo: function(){
alert(this === object);
}
};
object.foo(); // true
同样的原理适用于当调用一个函数时通过new的操作符创建一个对象的实例。当以这种方式调用时,this 的值将被设置为新创建的实例:
function foo(){
alert(this);
}
foo() // window
new foo() // foo
javascript是一个单线程语言,这意味着在浏览器中同时只能做一件事情。当javascript解释器初始执行代码,它首先默认竟如全局上下文。每次调用一个函数将会创建一个新的执行上下文。
这里经常发生混淆,这术语”执行上下文(execution context)“在这里的所要表达的意思是作用域,不是前面讨论的上下文。
参考http://uule.iteye.com/blog/1158829
http://www.cnblogs.com/f-dream/p/4950918.html
Call 和 Apply
这两个简单的方法,内建在所有的函数中,允许在自定义上下文中执行函数。call 函数需要参数列表而 apply 函数允许你传递参数为数组: 复制代码代码如下:
function user(first, last, age){
// do something
}
user.call(window, 'John', 'Doe', 30);
user.apply(window, ['John', 'Doe', 30]);
执行的结果是相同的,user 函数在window上下文上被调用,并提供了相同的三个参数。
call 方法可以用来代替另一个对象调用一个方法。call 方法可将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象。
以前我的理解太浅薄了,以为就是一个意思,其实一个句号一个意思,体现在方向不同。第一个借用别人的函数,第二个借用别人的上下文环境。
function add(a,b)
{
alert(a+b);
}
function sub(a,b)
{
alert(a-b);
}
add.call(sub,3,1);
个人理解call和apply的作用就是切换函数的对象上下文。“这个例子中的意思就是用 add 来替换 sub“,应该是将add执行的上下文由window切换为sub,即this指向是从window变为sub,仅此而已,并非add替换sub