JavaScript总结(五)-函数部分

1、函数定义

  • 函数声明的语法:
function functionName(parameters) {
  执行的代码
}
  • 函数声明后不会立即执行,会在我们需要的时候调用到。
    分号是用来分隔可执行JavaScript语句。
    由于函数声明不是一个可执行语句,所以不以分号结束。
  • 函数提升:
    函数可以在声明之前调用,使用表达式定义函数时无法提升。
  • 自调用函数
    函数表达式可以 “自调用”。
    自调用表达式会自动调用。
    如果表达式后面紧跟 () ,则会自动调用。
    不能自调用声明的函数。
    通过添加括号,来说明它是一个函数表达式:
<script>
(function () {
    document.getElementById("demo").innerHTML = "Hello! 我是自己调用的";
})();
</script>
  • JavaScript 函数有 属性 和 方法。
    arguments.length 属性返回函数调用过程接收到的参数个数:
function myFunction(a, b) {
    return arguments.length;
}

toString() 方法将函数作为一个字符串返回:

function myFunction(a, b) {
    return a * b;
}
var txt = myFunction.toString();
  • 函数定义作为对象的属性,称之为对象方法。
    函数如果用于创建新的对象,称之为对象的构造函数。
  • 箭头函数
    语法①:
(参数1, 参数2, …, 参数N) => { 函数声明 }

(参数1, 参数2, …, 参数N) => 表达式(单一)
// 相当于:(参数1, 参数2, …, 参数N) =>{ return 表达式; }

语法②:只有一个参数时,圆括号是可选的。

(单一参数) => {函数声明}
单一参数 => {函数声明}

语法③:无参

() => {函数声明}

实例:

var x = function(x, y) {         //ES5
     return x * y;
}
const x = (x, y) => x * y;       //ES6

–有的箭头函数都没有自己的 this。当我们使用箭头函数的时候,箭头函数会默认帮我们绑定外层 this 的值,所以在箭头函数中 this 的值和外层的 this 是一样的。
箭头函数是不能提升的,所以需要在使用之前定义。
使用 const 比使用 var 更安全,因为函数表达式始终是一个常量。
如果函数部分只是一个语句,则可以省略 return 关键字和大括号 {}。
2、函数参数
JavaScript 函数对参数的值没有进行任何的检查。
函数显式参数在函数定义时列出。
函数隐式参数在函数调用时传递给函数真正的值。
ES5 中如果函数在调用时未提供隐式参数,参数会默认设置为: undefined

  • JavaScript 函数有个内置的对象 arguments 对象。
    argument 对象包含了函数调用的参数数组。
  • 通过值传递参数
    在函数中调用的参数是函数的隐式参数。
    JavaScript 隐式参数通过值来传递:函数仅仅只是获取值。
    如果函数修改参数的值,不会修改显式参数的初始值(在函数外定义)。
    隐式参数的改变在函数外是不可见的。
  • 通过对象传递参数
    在JavaScript中,可以引用对象的值。
    因此我们在函数内部修改对象的属性就会修改其初始的值。
    修改对象属性可作用于函数外部(全局变量)。
    修改对象属性在函数外是可见的。
    3、函数调用
    ①函数作为方法调用
  • 在 JavaScript 中你可以将函数定义为对象的方法。
var myObject = {
    firstName:"John",
    lastName: "Doe",
    fullName: function () {
        return this.firstName + " " + this.lastName;
    }
}
myObject.fullName();  

fullName 方法是一个函数。函数属于对象。 myObject 是函数的所有者。
this对象,拥有 JavaScript 代码。实例中 this 的值为 myObject 对象。
②使用构造函数调用函数

  • 如果函数调用前使用了 new 关键字, 则是调用了构造函数。
    这看起来就像创建了新的函数,但实际上 JavaScript 函数是重新创建的对象
// 构造函数:
function myFunction(arg1, arg2) {
    this.firstName = arg1;
    this.lastName  = arg2;
}
 
// This    creates a new object
var x = new myFunction("John","Doe");
x.firstName;                             // 返回 "John"

构造函数的调用会创建一个新的对象。新对象会继承构造函数的属性和方法。
0、构造函数中 this 关键字没有任何的值。
this 的值在函数调用实例化对象(new object)时创建。
③作为函数方法调用函数

  • 在 JavaScript 中, 函数是对象。JavaScript 函数有它的属性和方法。
    call() 和 apply() 是预定义的函数方法。 两个方法可用于调用函数,两个方法的第一个参数必须是对象本身。
function myFunction(a, b) {
    return a * b;
}
myObject = myFunction.call(myObject, 10, 2);     // 返回 20
function myFunction(a, b) {
    return a * b;
}
myArray = [10, 2];
myObject = myFunction.apply(myObject, myArray);  // 返回 20

两者的区别在于第二个参数: apply传入的是一个参数数组,也就是将多个参数组合成为一个数组传入,而call则作为call的参数传入(从第二个参数开始)。

  • 在 JavaScript 严格模式(strict mode)下, 在调用函数时第一个参数会成为 this 的值, 即使该参数不是一个对象。
    在 JavaScript 非严格模式(non-strict mode)下, 如果第一个参数的值是 null 或 undefined, 它将使用全局对象替代。

通过 call() 或 apply() 方法你可以设置 this 的值, 且作为已存在对象的新方法调用。
4、闭包
JavaScript 变量可以是局部变量或全局变量。
私有变量可以用到闭包。
变量声明时如果不使用 var 关键字,那么它就是一个全局变量,即便它在函数内定义。
闭包是一种保护私有变量的机制,在函数执行时形成私有的作用域,保护里面的私有变量不受外界干扰。直观的说就是形成一个不销毁的栈环境。

  • JavaScript 内嵌函数
    JavaScript 支持嵌套函数。嵌套函数可以访问上一层的函数变量。
    该实例中,内嵌函数 plus() 可以访问父函数的 counter 变量:
function add() {
    var counter = 0;
    function plus() {counter += 1;}
    plus();    
    return counter; 
}

如果我们能在外部访问 plus() 函数,这样就能解决计数器的困境。
我们同样需要确保 counter = 0 只执行一次。
我们需要闭包。

var add = (function () {
    var counter = 0;
    return function () {return counter += 1;}
})();
 
add();
add();
add();
 
// 计数器为 3

变量 add 指定了函数自我调用的返回字值。
自我调用函数只执行一次。设置计数器为 0。并返回函数表达式。
add变量可以作为一个函数使用。非常棒的部分是它可以访问函数上一层作用域的计数器。
这个叫作 JavaScript 闭包。它使得函数拥有私有变量变成可能。
计数器受匿名函数的作用域保护,只能通过 add 方法修改。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值