函数实际上是对象,每一个函数都是Function类型的实例,而且都与其他引用类型一样具有属性和方法。由于函数是对象,因此函数名就是指向函数对象的指针,不会与某一个函数绑定
function wq(a, b) { return a + b }
console.log(wq(10, 10)) // 20
var sum = wq // 这里使用wq函数时是不带括号的,不带括号是访问函数指针,带括号调用函数
console.log(sum(10, 20)) // 30
wq = null
console.log(sum(10, 10)) // 20
上面的代码先定义了一个wq函数,然后return求和的值,随后声明了变量sum并将其设置为与sum相等,这时wq和sum都指向了同一个函数,后面把wq设为null,这并不妨碍sum指向函数 上面代码说明了函数名就是指向函数对象的指针
没有重载
现在把函数名想象成指针,有助于自己理解为什么js没有函数重载的概念
function addSomeNumber(num) { return num + 100 }
function addSomeNumber(num) { return num + 200 }
var result = addSomeNumber(100) // 300
把上面的函数变化一下
var addSomeNumber = function(num) { return num + 100 }
var addSomeNumber = function(num) { return num + 200 }
这就说明,在创建第二个函数时,实际上是覆盖了引用第一个函数的变量
函数声明与函数表达式
解析器在向执行环境中加载数据时,对函数声明和函数表达式并非一视同仁。解析器会率先读取函数声明,并使其在执行任何代码之前可用(可以访问到这个函数)。至于函数表达式,就必须等到解析器执行到它所在的代码行,才会真正被解释执行
console.log(sum(10, 10))
function sum(a, b) { return a + b }
上面代码可以正常运行,因为在代码开始执行之前,解析器就已经通过一个名为函数声明提升的过程,读取并将函数声明添加到执行环境中。对代码求值时,JavaScript引擎在第一遍会声明函数并将它们放到源代码树的顶部。所以,即使声明函数的代码在调用它的代码后面,JavaScript引擎也能把函数声明提升到顶部。 就像理解变量提升一样的道理
但是,函数表达式则不同
console.log(sum(10, 10))
var sum = function(a, b) { return a + b }
上面代码会报错,原因在于函数位于一个初始化语句中,而不是一个函数声明,在执行到函数所在的语句之前,变量sum中不会保存有对函数的引用,而且,由于第一行代码就会报错(找不到sum),实际上后面的代码也不会继续执行
www.cnblogs.com/isaboy/p/ja… 参考函数声明和函数表达式的区别 JavaScript高程