1.函数是对象
函数名实质上是一个指向函数对象的指针,不与某个函数绑定。
定义函数有三种方式:
1.函数声明语法
function func(){
alert('这是函数声明');
}
2.函数表达式
var text = function () {
return '这是函数表达式';
}
3.Function构造函数
Function构造函数可以接收任意数量的参数,但是最后一个参数被看作函数体。
var sum = Function("num1", "num2", "return num1 + num2");
2.函数执行
js解析器在解析代码时,会先读取函数的声明,并使其在执行任何代码之前可用(可访问),至于函数表达式,则必须等到解析器执行到它所在的代码行时,才会执行。
声明式:
alert(num())
function num() {
return 1;
}
上面的代码没问题,但下面的代码就会报错。
表达式:
alert(num())
var num = function () {
return 1;
}
3.函数内部属性
函数内部有两个特殊的对象:this,arguments.
arguments是一个类数组对象,包含传入函数的所有参数,但是它还有一个属性callee,该属性是一个指针,指向拥有arguments的函数。
1.arguments
// 计算阶乘
function factorial (num) {
if (num <= 1) {
return 1;
} else {
return num * factorial(num -1);
}
}
// 存在问题:函数执行与函数名存在耦合,修改:
function factorial2 (num) {
if (num <= 1) {
return 1;
} else {
return num * arguments.callee(num -1);
}
}
var x = factorial2
console.log(x(5))
2.this
this引用的是函数执行的环境对象(在网页全局作用域中this对象引用的是windows)
4.函数属性与方法
每个函数包含两个属性:length和prototype.length属性表示函数希望接收的命名参数的个数。对于引用类型,prototype保存着它们所有的实例方法,该属性无法枚举。
两个方法:apply()和call()
apply()接受两个参数,参数1,执行函数的作用域,参数2,参数数组,可以是arguments或者数组。
call()与apply()类似,只是参数的接受方式变了,参数须直接传入。
// 计算阶乘
function factorial (num) {
if (num <= 1) {
return 1;
} else {
return num * factorial(num -1);
}
}
console.log(factorial.length) // 1
console.log(factorial.apply(this, [5])) // 120
console.log(factorial.call(this, 5)) // 120
call()与apply可以修改函数的作用域
window.color = 'red';
var o = {color: "blue"};
function sayColor() {
console.log(this.color)
}
sayColor() // red
sayColor.call(window) // red
sayColor.call(this) // red
sayColor.call(o) // blue
除此外,还有bind(),该方法会创建一个函数的实例,其this值会被绑定到传给bind()函数的值。
sayColor.bind(o); // ƒ sayColor() { console.log(this.color) }
var func = sayColor.bind(o);
func(); // blue
评论列表
已有0条评论