1、概述
var print = function x(){ console.log(typeof x); }; x // ReferenceError: x is not defined
var f = function () { console.log(‘1‘); } function f() { console.log(‘2‘); } f() // 1
2、函数的属性和方法
function f(a, b) {} f.length // 2 // 上面代码定义了空函数f,它的length属性就是定义时的参数个数。不管调用时输入了多少个参数,length属性始终等于2。 // length属性提供了一种机制,判断定义时和调用时参数的差异,以便实现面向对象编程的“方法重载”(overload)。
3、函数作用域
var a = 1; var x = function () { console.log(a); }; function f() { var a = 2; x(); } f() // 1
4、参数
function f(a, b) { return a; } f(1, 2, 3) // 1 f(1) // 1 f() // undefined f.length // 2 // 没有办法只省略靠前的参数,而保留靠后的参数。如果一定要省略靠前的参数,只有显式传入undefined。
var p = 2; function f(p) { p = 3; } f(p); p // 2 // 上面代码中,变量p是一个原始类型的值,传入函数f的方式是传值传递。因此,在函数内部,p的值是原始值的拷贝,无论怎么修改,都不会影响到原始值。
var obj = { p: 1 }; function f(o) { o.p = 2; } f(obj); obj.p // 2
var obj = [1, 2, 3]; function f(o) { o = [2, 3, 4]; } f(obj); obj // [1, 2, 3] // 这是因为,形式参数(o)的值实际是参数obj的地址,重新对o赋值导致o指向另一个地址,保存在原地址上的值当然不受影响。
function f(a, a) { console.log(a); } f(1, 2) // 2 function f(a, a) { console.log(a); } f(1) // undefined
原文:https://www.cnblogs.com/wz-front-end/p/14979014.html