js经典实例 第三章

第三章,js的构建快

有三种基本的方式可以创建函数

1.声明式函数

声明式函数

声明式函数是通过fiunction关键字触发的

匿名函数

函数字面值或函数表达式

// 函数表达式(function expression) 
var h = function() {
      // h
}
​
// 函数声明(function declaration) 
function h() {
      // h
}

如果使用一个声明式的函数,可以将其放置在代码中的任何位置,如果是用var的表达式,必须将其放置在函数调用的前面

声明式函数会发生变量提升,而var的函数不会

问题:有一段代码可能比较消耗时间,并且在等待其完成时,你不想阻塞其他的代码

解决方案

将一个回调函数和setTimeout()结合起来,定时器设置为0

回调函数的意思就是一个函数作为参数传递给另一个函数,在某个条件下在函数内部调用传入的函数,或者在一个进程的末尾调用它

闭包

在一个函数内部创建一个函数,让他们都访问该数据,然后从外围函数返回内部函数,从另一个函数返回一个函数,当返回的函数使用外围的函数的作用域的时候,这称为函数闭包

function outer(x){
    return function(y){return x*y};
}
var multiThree=outer(3);
alert(multiThree(2)) //6

问题想要对一个函数的参数使用Array功能,但是argumengts对象并不是数组

//使用Array.prototype.slice(),然后是函数call()方法,将arguments集合转换到一个数组当中
function someFunc(){
    var args=Array.prototyepe.slice.call(arguments)
}
//或者,如下是一种较为简单的方法
function someFunc(){
    var args =[].slice.call(arguments);
}

slice()方法返回了对数组的一部分的一个浅拷贝,或者如果没有给定起始值的话,就是整个数组的浅拷贝.slice()方法也是一个函数,这意味着,诸如call()这样的函数可以和他一起使用,在这段代码中,给call()传入了函数的arguments,她对参数列表执行必要的转换,把得到的数组传递给slice()

问题将NodeList转换为一个数组,让他可以用forEach()传递每一个节点

var nl = document.querySelectorAll("div");
      var al = [].slice.call(nl);
      al.forEach(element => {
        console.log(element.textContent);
      });

使用匿名函数包装全局变量

问题:需要创建一个变量,在调用函数之间维护状态,但是,你想避免使用全局变量

(function(){
    var i=0
    function increment(){
        i++
        alert("values is"+i)    
    }
    function runIncrent(){
        while(i<5){
            increment()
        }
    }
    window.οnlοad=function(){
        runIncrement()
    }
}
)()

提供一个默认的参数

问题在调用函数时,如果没有给定参数值的话,你想要指定一个默认的参数

function makeString(str,Idelin="'",rdelim="'"){
    return Idelim +str+rdelim
}
console.log(makeString(169))  //"'169'"

转载于:https://my.oschina.net/u/4004801/blog/3010133

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值