递归,闭包,闭包与变量

递归是在一个函数内部调用自身:

function factorial(num){

  if(num<=1){

  return 1;

  }else{

  return num*factorial(num-1)

  }

}

但是会出现问题:

var fan=factorial;

fun(4);

factorial=null;

在调用fun(4)时,先执行上面的函数,到else内时,factorial已经被改了,所以得不到正确的结果.

使用arguments.callee代替函数就不会出错.

闭包:

创建函数时会预先创建包含全局活动对象的作用域链当调用函数时为函数创建执行环境,执行环境复制之前的活动对象构建全局作用域链.执行环境的作用域链包含了函数的活动对象//arguments和this也包含在里面和全局活动对象.

作用域链的本质是指针列表

当函数执行完毕局部活动对象就被销毁,仅保留全局的变量活动对象

闭包不同;闭包引用了外部函数的活动对象,所以外部函数执行完毕,其活动对象还保留着.一直到闭包解除 将引用设为null;

闭包的变量;

闭包包含着外部函数的活动对象,所以闭包在使用外部函数变量的时候保留的是最后一个值.

所以会出现非想要的结果.

利用立即执行函数可以保留外部函数的每一个值

function createFunctions(){
    var result = new Array();
    for (var i=0; i < 10; i++){
        result[i] = function(num){
            return function(){

return num;

    return result;
}
关于闭包中的this对象,
var name = "The Window";
var object = {
    name : "My Object",
    getNameFunc : function(){
        return function(){
            return this.name;
        };

} };

alert(object.getNameFunc()()); //"The Window"

闭包是被返回到函数外部执行,闭包自身的活动对象中也包含用this和arguments对象所以不会保留其父函数的this对象解决办法:在父函数中设置that=this;然后在闭包中使用that;
时间: 2024-08-02 02:40:21

递归,闭包,闭包与变量的相关文章

一篇文章带你了解JavaScript中的函数表达式,递归,闭包,变量,this对象,模块作用域

作者 | Jeskson 来源 | 达达前端小酒馆 定义函数的方式: 第一种为 函数声明: 第二种为 函数表达式. 语法: function functionName(arg0, arg1, arg2) { // 函数体 } 在Firefox,Safari,Chrome和Opera有效: 就是通过这个属性可以访问到这个函数指定的名字. console.log(functionName.name); // 'functionName' 函数声明: 它的一个重要特点就是:函数声明提升,就是在执行代码

读javascript高级编程03-函数表达式、闭包、私有变量

一.函数声明和函数表达式 定义函数有两种方式:函数声明和函数表达式.它们之间一个重要的区别是函数提升. 1.函数声明会进行函数提升,所以函数调用在函数声明之前也不会报错: test(); function test(){ alert(1); } 2.函数表达式不会进行函数提升,函数调用在函数声明之前的话会报错: test(); // test is not a function var test=function(){ alert(1); } 二.递归函数 递归函数是通过在函数内部调用自身实现的

PHP 闭包获取外部变量和global关键字声明变量的区别

最近在学习workerman的时候比较频繁的接触到回调函数,使用中经常会因为worker的使用方式不同,会用这两种不同的方式去调用外部的worker变量,这里就整理一下PHP闭包获取外部变量和global关键字声明变量的区别. 闭包 闭包是一个常见的概念,我们通常可以将其与回调函数配合使用,可以使代码更加简洁易读. 闭包可以通过拷贝的方式让函数使用父作用域中的变量.如: $global = 'hello'; $bbb = function()use($global){ echo $global.

递归方式的对变量中的特殊字符进行转义/去除转义

方法一:(循环) /********************************************************************工具类*******************************************     * 描述 : 深度加/删反斜杠     * 参数 :     *     &data : 指定替换的数组     *      func : addslashes(默认)=添加反斜杠, stripslashes=删除反斜杠     */   

递归、闭包、私有变量、特权方法、单例、模块模式(module pattern)

//使用命名函数表达式实现递归 var factorial = (function f(num) {     if (num <= 1) {         return 1;     } else {         return num * f(num - 1);     } }); //用作块级作用域(私有作用域)的匿名函数 (function(){     var now = new Date();     if (now.getMonth() == 0 && now.get

谈谈闭包中的 - 变量

  前面几篇文章中提到过,作用域链以及闭包的概念,这里就不一一重复了,   作用域链的这种配置机制引出了一个值得注意副作用,既闭包只能取得包含函数中任何变量的最后一个值.别忘了闭包所保存的是整个变量对象,而不是某个特殊的变量.         function createFunctions(){             var result = new Array();             for(var i=0;i<10;i++){                 result[i] =

js for循环闭包解决循环变量i遍历值

参考:http://www.cnblogs.com/syf/archive/2012/10/04/2711828.html 如下的html,为什么每次输出都是5,而不是点击每个p,就alert出对应的1,2,3,4,5. [html] view plaincopyprint? <html > <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"

闭包的查找变量顺序

//var n=9; function f1(){ //n=99; function f2(){ var n=999; console.log(n); } return f2; } var result=f1(); result(); // 999 //先在f2中查找有没有变量n,再在f1中查找有没有变量n,最后在全局作用域中查找有没有变量n 看下面这几个例子就知道闭包的查找顺序了(其实就是根据函数的作用域链来查找) var name="xiu"; var obj={ name:&qu

javascript 闭包与函数变量作用域

浏览器事件循环工作原理 浏览器有一个事件循环用于检查事件队列,处理延时的事件.UI事件(例如:点击,滚动等),ajax回调,以及提供给setTimeout()和setInterval()的回调,都会依次被事件循环处理. 因此,当调用setTimeout()函数时,即使延迟的时间被设置为0,提供的回调也会被排队 回调会呆在队列中,直到指定的时间用完后,引擎开始执行动作(如果它当前不执行其他动作) 因此,即使setTimeout()回调被延迟0ms,它仍然会被排队,并且直到函数中其他非延迟的语句被执