1、function 声明和表达式
函数是对象,函数名是指针
命名函数表达式
var foo = function bar() {
bar // works
}
bar() //为定义
一旦bar函数赋值给foo,bar 没有在外部作用域不能用;然而在bar函数内部作用域可用,这是由于JavaScript中命名解析工作机制,命名函数在函数自己的本地作用域总是可用。
this是如何工作的
JavaScript中this引用于其他程序语言有着不同的概念;在该语言中this值被绑定,恰好5中不同方式
1、全局作用域
console.log(this) //global/window
function foo() {
console.log(this) //global/window
}
foo()
this引用全局作用域
2、调用一个方法
var bar = 2
var a ={
bar :1,
foo :function (){
console.log(this)
}
}
a.foo() //Object {bar: 1} 引用a对象
3、调用一个构造函数
new foo() //foo对象
this 将引用一个新创建的对象
4、this显示设置
function foo(a,b,c) { console.log(this)}
var bar = {}
foo.apply(bar,[1,2,3]) //Object {} (也就是这个bar对象)
foo.call(bar,1,2,3) //Object {}
但用Function.prototype的call 和apply方法时,被调用函数中的this值显示设置为,相应调用函数的第一个参数;
普遍的陷阱
var foo.method = function (){
function test(){
console.log(this) //window
}
test()
}
当我们想得到this引用的是a时我们可以这样解决
1、保存this给一个本地变量
var foo.method = function (){
var self = this
function test(){
console.log(self) //Object {} 形成一个闭包
}
test()
}2、在ECMAScript 5中能使用bind方法结合匿名函数实现同样的效果
foo.method = function (){
var test = function (){
console.log(this) //Object {}
}.bind(this)
test()
}
5、方法赋值
var a ={
foo :function (){
console.log(this) //window
}
}
var b = a.foo
b()
functionFoo(){}
Foo.prototype.method=function(){ console.log(this)};
function Bar(){}
Bar.prototype=Foo.prototype;
newBar().method(); // this->Bar{}
在方法赋值中,this指向的就是最后实现调用的哪个变量