JS函数

作者: zhenghongmo | 来源:发表于2020-03-13 16:35 被阅读0次

函数的5种声明

  1. 具名函数
 function f(x,y){
     return x+y
 }
 f.name // 'f'
  1. 匿名函数
 var f
 f = function(x,y){
     return x+y
 }
 f.name // 'f'
  1. 具名函数赋值
 var f
 f = function f2(x,y){ return x+y }
 f.name // 'f2'
 console.log(f2) // undefined
  1. window.Function
 var f = new Function('x','y','return x+y')
 f.name // "anonymous"(匿名)
  1. 箭头函数
 var f = (x,y) => {
     return x+y
 }
 var sum = (x,y) => x+y
 var n2 = n => n*n

调用函数

  • f.call(asThis, input1,input2)

    其中 asThis 会被当做 this

    [input1,input2] 会被当做 arguments

<font color="red">call/apply/bind</font>

  1. call/apply
    • 改变this值
    • 操作参数
    • apply可以以数组形式传值
function print(b,c){

}
print.call({a:2},'hi','hello')
print.apply({a:2},['hi','hello'])
//{a:2}为this,b为‘hi’,c为‘hello’
  1. bind
    • 切换上下文,第一个参数传this值
    • 科里化
    • 返回另一个函数
function fn(b,c){

}
let curryfn = fn.bind({a:2},'hi')
curryfn('hello')
//{a:2}为this,b为‘hi’,c为‘hello’

this 和arguments

function f(){
    'use strict'//开启严格模式,才能显示出this的值,否则会显示this为Window
    console.log(this)
    console.log(arguments)
    return undefined
}
f.call(1,2,3) // this 为 1,arguments 为 [2,3]

call stack

普通调用

嵌套调用

递归调用

作用域

拿到代码,先变量提升

  1. 实例1
var a = 1
function f1(){
    alert(a) // 是多少
    var a = 2
}
f1.call()

变量提升==>

function f1(){
    var a 
    alert(a) // 是undefined
    a = 2
}
  1. 实例2
var a = 1
function f1(){
    var a = 2
    f2.call()
}
function f2(){
    console.log(a) // 是1,因为f2属于全局变量,f1中的var a=2是局部变量,只在f1中有效
}
f1.call()
  1. 实例3
var liTags = document.querySelectorAll('li')
for(var i = 0; i<liTags.length; i++){
    liTags[i].onclick = function(){
        console.log(i) // 点击第3个 li 时,打印 2 还是打印 6?==>6
    }
}

闭包

参考网站

  • 如果一个函数使用了它范围外的变量,那么(这个函数+这个变量)就叫做闭包
var a=1
function f(){
    console.log(a)
}
f和a就组成了一个闭包

相关文章

网友评论

      本文标题:JS函数

      本文链接:https://www.haomeiwen.com/subject/wvgujhtx.html