JavaScript笔试知识点整理
2018.09.28
2018.09.29
2018.09.30
定义函数
在Javascript定义一个函数f有三种方式:第1种最常用,后两种都是把一个匿名函数复制给变量f
- 函数声明:
function
f(x){ alert(x); } - 函数表达式: var f =
function
(x){ alert(x); } - 构造函数: var f = new
Function
(‘x’, ‘alert(x);’)
var f = function g() {
// 函数外部无法通过 g 访问到函数
return 23;
};
typeof g;// undefined
typeof f();// "number"
typeof g();// Error
函数执行完一次,若无return 返回值和声明变量接受返回值,都会立即消失成为undefined
output(typeof (function() {output(“Hello World!”)})());// Hello World! undefined
变量提前
函数声明可以被提前,但函数表达式不能被提前
(function() {
//var foo; 被提前的foo
var x=foo();
var foo=function foo() {
//函数声明foo(等号左边)被提前
return “foobar”
};
return x;// foo未被定义为函数,报错
})();
this指向
this是在函数执行时被绑定的,它始终代表的是调用当前函数的那个对象。4种函数调用模式
- 方法调用
函数被保存为一个对象的属性时,称其为该对象的方法。方法被调用时,this被绑定到这个对象上。
var name = "window";
var obj_0 = {
name: "goozy",
sayName: function() {
//函数作为对象的属性称为方法
console.log(this.name); // this绑定到obj_0
}
};
obj_0.sayName(); // goozy
var f = obj_0.sayName;
f();// window
- 函数调用
函数不是对象的属性时,那么它就是被当做函数调用。this被绑定为全局对象,浏览器环境下即
window
对象。
var name = "window";
function sayName() {
console.log(this.name);
}
sayName();
- 构造函数
函数加上
new
来调用,会创建一个连接到该函数prototype成员的新对象,同时,this会被绑定到这个新对象上。这个函数就称为此对象的构造函数。
function Obj_1() {
this.name = "goozy";
}
var person = new Obj_1();//Obj_1作为构造函数被调用,this被绑定为新创建的对象person
console.log(person.name); //goozy
- apply调用
所有函数对象的
apply
和call
方法可以让我们构建一个参数数组/列表传递给调用函数,也允许改变this的值。
var name = "window";
var person = {
name: "goozy"
};
function sayName() {
console.log(this.name);
}
sayName(); //window
sayName.apply(person); //goozy(apply模式调用sayName,传入第一个参数为person,this被绑定到person对象)
sayName.apply(); //window
- 练习
person2.sayName(); 这还是
方法调用
模式,对象为person2,sayName函数体最终执行
的函数是fun,fun是用函数调用
模式调用的。this绑定为window,结果为window。
var name = "window";
function showName() {
console.log(this.name);
}
var person1 = {
name: "goozy",
sayName: showName
}
var person2 = {
name: &#