函数-Function类型

JavaScript 2020-05-31 893

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  

标签:JavaScript

文章评论

评论列表

已有0条评论