JS函数以及闭包

-JavaScript 函数定义
JavaScript 使用关键字 function 定义函数。
函数可以通过声明定义,也可以是一个表达式。
函数表达式可以存储在变量中:
var x = function (a, b) {return a * b};
在函数表达式存储在变量后,变量也可作为一个函数使用:
var x = function (a, b) {return a * b};
var z = x(4, 3);
-Function() 构造函数
var myFunction = new Function("a", "b", "return a * b");
var x = myFunction(4, 3);
等价于:
var myFunction = function (a, b) {return a * b}
var x = myFunction(4, 3);
-函数提升(Hoisting)
提升(Hoisting)是 JavaScript 默认将当前作用域提升到前面去的的行为。
提升(Hoisting)应用在变量的声明与函数的声明。
因此,函数可以在声明之前调用:
myFunction(5);
function myFunction(y) {
   return y * y;
}
使用表达式定义函数时无法提升。
-自调用函数
自调用表达式会自动调用。如果表达式后面紧跟 () ,则会自动调用。不能自调用声明的函数。
通过添加括号,来说明它是一个函数表达式
(function () {
   var x = "Hello!!";      // 我将调用自己
})();
-函数是对象
使用 typeof 操作符判断函数类型将返回 "function" 。
toString() 方法将函数作为一个字符串返回:
-JavaScript 函数参数
函数显式参数(Parameters)与隐式参数(Arguments):
函数显式参数在函数定义时列出。
函数隐式参数在函数调用时传递给函数真正的值。
参数规则
JavaScript 函数定义时显式参数没有指定数据类型。函数对隐式参数没有进行类型检测。函数对隐式参数的个数没有进行检测。
默认参数
如果函数在调用时未提供隐式参数,参数会默认设置为: undefined
function myFunction(x, y) {
   y = y || 0;
}
如果y已经定义 , y || 返回 y, 因为 y 是 true, 否则返回 0, 因为 undefined 为 false。
如果函数调用时设置了过多的参数,参数将无法被引用,因为无法找到对应的参数名。 只能使用 arguments 对象来调用。
-Arguments 对象
JavaScript 函数有个内置的对象 arguments 对象。
argument 对象包含了函数调用的参数数组。
-通过值传递参数
在函数中调用的参数是函数的隐式参数。
JavaScript 隐式参数通过值来传递:函数仅仅只是获取值。
如果函数修改参数的值,不会修改显式参数的初始值(在函数外定义)。
隐式参数的改变在函数外是不可见的。
-通过对象传递参数
在JavaScript中,可以引用对象的值。
因此我们在函数内部修改对象的属性就会修改其初始的值。
修改对象属性可作用于函数外部(全局变量)。
修改对象属性在函数外是可见的。
-JavaScript 函数调用
JavaScript 函数有 4 种调用方式。
每种方式的不同方式在于 this 的初始化。
一般而言,在Javascript中,this指向函数执行时的当前对象。
注意 this 是保留关键字,你不能修改 this 的值。
-调用 JavaScript 函数
function myFunction(a, b) {
   return a * b;
}
myFunction(10, 2); 
myFunction() 和 window.myFunction() 是一样的。它始终是默认的全局对象。
-全局对象
当函数没有被自身的对象调用时, this 的值就会变成全局对象。
在 web 浏览器中全局对象是浏览器窗口(window 对象)。使用 window 对象作为一个变量容易造成程序崩溃。
-函数作为方法调用
var myObject = {
   firstName:"John",
   lastName: "Doe",
   fullName: function () {
       return this.firstName + " " + this.lastName;
   }
}
myObject.fullName();         // 返回 "John Doe"
创建了一个对象 (myObject), 对象有两个属性 (firstName 和 lastName), 及一个方法 (fullName):
fullName 方法是一个函数。函数属于对象。 myObject 是函数的所有者。
this对象,拥有 JavaScript 代码。实例中 this 的值为 myObject 对象。
-使用构造函数调用函数
如果函数调用前使用了 new 关键字, 则是调用了构造函数。
这看起来就像创建了新的函数,但实际上 JavaScript 函数是重新创建的对象
构造函数中 this 关键字没有任何的值。
this 的值在函数调用时实例化对象(new object)时创建。
-作为函数方法调用函数
函数是对象。JavaScript 函数有它的属性和方法。
call() 和 apply() 是预定义的函数方法。 两个方法可用于调用函数,两个方法的第一个参数必须是对象本身。
function myFunction(a, b) {
   return a * b;
}
myObject = myFunction.call(myObject, 10, 2); 
function myFunction(a, b) {
   return a * b;
}
myArray = [10, 2];
myObject = myFunction.apply(myObject, myArray);  // 返回 20
两个方法都使用了对象本身作为第一个参数。 两者的区别在于第二个参数: apply传入的是一个参数数组,
也就是将多个参数组合成为一个数组传入,而call则作为call的参数传入(从第二个参数开始)。
-JavaScript 闭包
JavaScript 变量可以是局部变量或全局变量。
私有变量可以用到闭包。
JavaScript 内嵌函数:
所有函数都能访问全局变量。  
实际上,在 JavaScript 中,所有函数都能访问它们上一层的作用域。
JavaScript 支持嵌套函数。嵌套函数可以访问上一层的函数变量。
该实例中,内嵌函数 plus() 可以访问父函数的 counter 变量:
function add() {
   var counter = 0;
   function plus() {counter += 1;}
   plus();    
   return counter; 
}
--JavaScript 闭包
var add = (function () {
   var counter = 0;
   return function () {return counter += 1;}
})();
function myFunction(){
   document.getElementById("demo").innerHTML = add();
}
变量 add 指定了函数自我调用的返回字值。
自我调用函数只执行一次。设置计数器为 0。并返回函数表达式。
add变量可以作为一个函数使用。非常棒的部分是它可以访问函数上一层作用域的计数器。
这个叫作 JavaScript 闭包。它使得函数拥有私有变量变成可能。

































































































































评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值