javascript学习笔记

    xiaoxiao2025-05-27  12

    1、js的函数定义有3种形式

    a) 函数定义表达

    var f = function(x,y){return x+y;};

    函数定义表达式,使用一个变量来存函数,在调用函数表达式时,必须已经定义好了函数。因为在js中变量的声明被提前但是变量的赋值不会提前。可以指定函数名也可以不指定。

    b) 函数声明语句

    function f(x,y){return x+y};

    此种方式函数声明语句“被提前”到外部脚本或者外部函数作用域(该函数嵌套到外部函数时)的顶部,这种方式 可以在定义函数之前调用。

    c) 使用Function构造函数

    var f = new Function(“x”,”y”,”return x+y;”);

    此种方式,Function构造函数最后一个参数是函数主体,前面的参数是函数的形参,允许javascript在运行时动态的创建并编译函数。而且它创建的函数不使用词法作用域,相反函数体的代码编译总在全局作用域执行,不建议采用此次方式。

    d) 嵌套函数

    在函数中定义另一个函数,(里层函数)嵌套函数可以访问嵌套它们的函数(外层函数)的参数和变量。

    2、函数的调用

    a) 做为函数,普通的函数进行调用。

    b) 作为方法,函数作为对象的属性值。

    c) 作为构造函数。

    d) 通过call()apply()方法间接调用,有点感觉像java的反射。

    3、函数的实参和形参

    a) 当调用函数时传入的实参比函数声明的形参少,剩下的形参都将设置为undefined,如果比声明的形参多的话,会忽略。在函数体内,标识符arguments指向实参对象的引用,实参对象是一个类数组对象,就算实参个数多于行参个数一样的可以访问到。

    b) 除了数组元素,实参对象还定义了calleecaller属性,callee指代当前正在执行的函数,caller指代当前正在执行的函数的函数。

    4、闭包

    函数对象可以通过作用域链相互关联起来,函数体内部的变量可以保存在函数作用域内,这种特性被称为闭包。

    我们将作用域链描述为一个对象列表,每次调用js函数,都会创建一个新的对象用来保存局部变量,把这个对象添加到作用域链中,当函数返回时,就从作用域链中将这个绑定变量的对象删除。但是如果这个函数定义了嵌套的函数,并将它作为返回值或者存储在某处的属性里,这时就会有一个外部的引用指向这个嵌套的函数,那这个外部函数的作用域绑定的变量对象就不会被当做垃圾回收,嵌套函数所指向的变量绑定对象也不会被当做垃圾回收。

    总之,只要函数作为返回值或者保存在某处的属性中,那么外部函数的指向的变量绑定对象都不会被清空。

    5、函数属性、方法、构造函数

    a) length属性是函数定义时的形参个数,arguments.length(实际传入的实参个),arguments.callee.length(函数定义指定的形参个数)

    b) prototype属性指向函数的原型对象,当函数用作构造函数时,新创建的对象会从原型对象上继承属性

    c) call()方法和apply()方法

    第一个参数都是,调用的上下文,call后面的参数对于函数的形参,apply,第二参数是数组存放参数。

    d) bind()方法

    将函数f()绑定到某对象of.bind(o),该方法返回一个新的函数,新函数的调用会把f原始函数当做对象o的方法来调用。传给新函数的任何实参都会传给原始函数。绑定的同时还可以传函数的实参,绑定的实参和新函数的调用传的实参和按从左到右传入。

    转载请注明原文地址: https://ju.6miu.com/read-1299315.html
    最新回复(0)