JS 调用函数时带括号与不带括号的差异
看下面一段函数代码:
function text() {
return '666'
}
var a = text;
var b = text();
console.dir(a);
console.dir(b);
什么是函数:
上述代码中,显然text()
是函数。函数是一种叫做function
引用类型的实例,因此函数是一个对象。而对象是保存在内存中的,函数名则是指向这个对象的指针。
带不带括号赋值的差异:
a表示把函数名text这个指针拷贝一份给变量a,但是这不是指函数本身被复制了一份。它只是传递了函数体所在的地址位置,在需要的时候好找到函数体去执行。
b表示立即执行text这个函数,b的值为函数的return值。
看上图就可以很明显的看出差异。变量a
打印出来的是函数对象,而b
打印出来的是返回的值666。
什么时候用括号,什么时候不用括号呢?
函数只要是要调用它进行执行的,都必须加括号。此时,函数实际上等于函数的返回值或者执行效果,当然,有些没有返回值,但已经执行了函数体内的行为,就是说,加括号的,就代表将会执行函数体代码。
不加括号的,都是把函数名称作为函数的指针,一个函数的名称就是这个函数的指针,此时不是得到函数的结果,因为不会运行函数体代码。它只是传递了函数体所在的地址位置,在需要的时候好找到函数体去执行。
function text() {
xxxxxxx
}
window.onload = text;
比如上述这段代码,text
函数并不会在JS读到这段代码的时候就立即执行,浏览器加载文档的时候这句话会被加载,会被告知文档加载完要执行哪个函数,但实际上没有当时就执行,等到整个文档加载完成之后才会通过text
这个指针去执行text()
。
所以一般时候我们都是采用的是无括号的原因。因为括号是“函数调用运算符”,相当于在执行这样一个函数。