JS中的函数
学习链接: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions
在javascrit中,因为函数也有属性和方法(properties and methods),函数是第一类对象(first-class object).
在js中,所有的函数都是函数对象(Function object)
既然如此,那么函数和其他类型的对象有什么区别呢?
区别就在于函数是可以被调用的。
所有的函数都是可以调用的,但是并不是所有的可调用对象都是函数。
比如IE8以及之前的版本中,window.alert()和document.getElementById()
使用的是可调用的宿主对象,而不是内置函数对象。
那么如何来检测一个对象是不是真正的函数对象呢?
可以这么做:
1 function isFunction(obj) { 2 return Object.prototype.toString.call(obj) === '[object Function]'; 3 }
在js中所有函数的调用都会有个返回值。如果没有return语句的话,函数会返回默认的值:
a) 对于构造函数(constructor) 来说,返回的默认值就是 this 参数。
b) 对于其他函数来说,默认值就是 undefined。
现在有一个问题,js中的函数参数的值是怎么传递的,是值传递还是引用传递?
实际上,js中参数传递是 通过值传递(对象引用也是值,不过对象引用特殊点),
如果函数修改了参数的值(对参数重新赋值),这种改变不会反映到全局以及正在调用此函数的函数。
代码说明:
1 var foo = { 2 brand: 'BMW' 3 } 4 5 function bar(obj) { 6 obj = { 7 brand: 'changevalue' 8 } 9 } 10 11 bar(foo) 12 console.log(foo) // 会输出 { brand: 'BMW' }
如果函数只是改变了引用对象的属性会发生什么呢
答案是 这种改变在函数外部是可见的
1 function foo(obj) { 2 obj.brand = 'XD' 3 } 4 5 var Car = { 6 brand: 'BMW', 7 price: 'xxx' 8 } 9 10 console.log(Car.brand); // BMW 11 foo(Car); 12 console.log(Car.brand) // XD

浙公网安备 33010602011771号