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 

 

posted @ 2017-06-15 11:18  萧清水  阅读(240)  评论(0)    收藏  举报