前端之路

JS函数

2018-08-27  本文已影响0人  李不远

函数的5种声明

具名函数

function x (input1,input2){
    return undefined
}
//x 是一个特殊的变量,但是只能是函数
//输入1,输入2是参数
//必须有一个rturn值,不写的话,浏览器会自动添加

匿名函数

x = function (input1,input2){
    return undefined
}
//不能单独使用,需要赋给一个变量

具名函数赋给变量

var x = function y (input1,input2){}
console.log(y)
//Uncaught referenceError:y is not defined...

/* 不一致性!!! */

function y(){}
console.log(y)
//function y()

window.Function 函数对象

new Function('x','y','return x+y')
//x,y为参数;return x+y是函数体

箭头函数

(x,y) =>{return x+y}
(x,y) => x+y 
//函数体只有一句话,不能返回一个对象;花括号和return一起去掉
n => n*n
//参数只有一个,可以省略参数的括号

函数的name

function f(){}
f.name //"f"
var f = function (){}
f.name //"f"
var f = function f1(){}
f.name//"f1"
f = new Function()
f.name//"anonymous"  anonymous:匿名

如何调用函数

函数是什么?

JavaScript DOM编程艺术是这样定义的:

函数就是一组允许你在你的代码里随时调用的语句。每个函数实际上是一个短小的脚本。

eval():

作用:给一个字符串当作代码执行

eval('1+1')
eval('alert(1)')

call()

指向公用属性的__proto__.call()调用函数的函数体

f 是指对象

f.call()是执行对象的函数体

调用

函数的调用过程就是eval(函数体)的过程

f.call = function(){
    eval(f.body)
}

f.call()的用法

function f(x,y){return x+y}//函数本体
f(2,3)          //普通调用
f.call(undefined,1,2) //正规硬核调用

this和arguments

arguments 是一个对应于传递给函数的参数的类数组对象。

this对象是在运行时基于函数的执行环境绑定的,无法在执行期间被复制。全局函数中,this等于window;当函数作为某个对象的方法调用时,this等于那个对象。

call的第一个参数可以用this得到

call的后面的参数可以用arguments得到

f.call(undefined,1,2) 
//undefined是this
//1,2是argument
f = function(){
    console.log(this)
    console.log(arguments)
}

普通模式下,如果thisundefineduse strict严格模式,则thiswindow

如下所示

作用域

每个函数都有自己的执行环境;当代码在一个环境中执行时,会创建变量对象的一个作用域链

var a = 1
function f1(){
    var a = 2
    f2.call(undefined)

    function f2(){
        var a = 3
        console.log(a)
    }
}
f1.call(undefined)
console.log(a)

闭包

如果一个函数使用了它范围外的变量,那么这个函数加上这个变量就是闭包。

闭包是指有权访问另一个函数作用域中的变量的函数

——远方不远

上一篇下一篇

猜你喜欢

热点阅读