作用域和上下文之间关系亲密,但是不要把它们混。作用域与标识符指向什么变量有关,而上下文(或叫做接收器)则是与this关键字有关-----CoffeeScript中可将其简写为@
setName = (name) -> @name = name
cat = {}
cat.setName = setName
cat.setName 'Mittens'
console.log cat.name # 'Mittens' setName的函数的@或this 代表的是cat @name 代表的是cat.name
setName 'ABBCC' #对cat没有影响
pig = {}
setName.apply pig, ['Babe']
console.log pig.name #'Babe'
setName.call pig, 'Babe'
call 只能改变一个正常函数调用的上下文,而apply不但能够改变上下文而且还能传递一个任意数量的参数。
CoffeeScript中上下文的规则做个总结,前面的规则优先于后面的规则:
1 函数调用之前若有new关键字,则上下文为新建的对象;
2 使用call或者apply调用函数时,给定的第一个参数即为上下文;
3 否则,函数作为对象的属性(obj.func)或者obj['func']来调用时,它就把该对象作为上下文来运行;
4 如果与上述几条都不符,则函数在全局上下文中运行。