一个javascript面试题

javascript面试题代码:

<script type="text/javascript">
        function fun(x,y){
            console.log("log====fun外部x值="+x+",y的值="+y+"下一步输出y的值="+y);
            console.log(y);
            return{
                fun:function(m){
                    console.log("x的值="+x);
                    console.log("fun内部x值="+x+",m的值="+m+"m是下一步的参数值x");
                    return fun(m,x);
                }
            };
        }

        var a=fun(0);
        console.log(a);

        var a1=a.fun(1);
        console.log(a1);

        var a2=a.fun(2);
        console.log(a2);

        var a3=a.fun(3);
        console.log(a3);

        var b=fun(0).fun(1).fun(2).fun(3);

        console.log(fun(0));
        console.log(fun(0).fun(1));
        console.log(fun(0).fun(1).fun(2));
        console.log(fun(0).fun(1).fun(2).fun(3));

    </script>

已经调试前两行代码,输出结果为:

调试下两行代码:

var a1=a.fun(1);

console.log(a1);

接下来直接调试4行代码:

从输出内容上可以看到:x的值从来没有变过,一直是0

传进来的参数m不会修改x值的值。因为每次都是使用第一次返回的对象a来调用自己的函数,a内部引用的x的值一直是0。

后面的链式调用,每次调用完毕,都用本次调用的返回结果进行下次调用,每次调用完毕后,都会返回新的对象。这个新的对象内部引用的x的值都不是同一个。

除了第一次调用,后面的调用调用fun函数,都是内部的fun函数。

后面的代码我进行了改造,这样就更容易理解了。

修改后的代码,方便理解。

function fun(x,y){
            console.log("fun(x,y),参数x="+x+",参数y="+y+",下一步输出y的值="+y);
            console.log(y);
            return{
                innerFun:function(m){
                    console.log("innerFun,x的值="+x);
                    console.log("innerFun(m),参数m="+m);
                    console.log("下一步调用fun(m="+m+",x="+x+")");
                    return fun(m,x);
                }
            };
        }

        var a=fun(0);
        console.log(a);
        /*var a1=a.fun(1);
        console.log(a1);
        var a2=a.fun(2);
        console.log(a2);
        var a3=a.fun(3);
        console.log(a3);
        */

        var b=fun(0).innerFun(1).innerFun(2).innerFun(3);
        

1, 代码fun(0)这步调用完毕后,产生了一个闭包,返回结果{innerFun: ƒ}引用了fun的变量x,x的值为0;

2,使用{innerFun: ƒ}调用innerFun函数,传入的参数1会在该函数内部调用fun函数时,作为参数x传过去,然后当fun函数执行完毕,再次产生闭包,该闭包引用fun的变量x,

  x的值为1;

………………

依次类推,使用返回结果{innerFun: ƒ}再次调用innerFun函数,然后内部调用fun函数,就会传递引用的x的值,然后输出引用的x的值,也就是上次调用的参数值。

原文地址:https://www.cnblogs.com/Tpf386/p/11105002.html

时间: 2024-10-23 13:21:37

一个javascript面试题的相关文章

前端程序员经常忽视的一个JavaScript面试题

在网上找到一个有关JavaScript的面试题,特整理如下: function Foo() { getName = function () { alert (1); }; return this; } Foo.getName = function () { alert (2);}; Foo.prototype.getName = function () { alert (3);}; var getName = function () { alert (4);}; function getName

一个javascript面试题解析

var length = 10; function fn(){ console.log(this.length); } var obj = { length: 5, method: function (fn) { fn(); // 10 // 实际上,最终的结果:获取的是 实参的个数! arguments[0](); //// 结果:3 // 此时,就是作为对象的方法来调用的,所以,此时, // 函数内部的this就指向了当前的对象! // 最终获取到的就是:arguments.length,获

Javascript面试题解析

Javascript的一些面试题让很多同学感到头疼,下面就根据兄弟连教育(www.lampbrother.net)毕业学员面试遇到的面试题,给大家做一个简单的分享,希望对初入职场的你们有一些帮助:Javascript面试题解析. 第一题 /* 解析: + 优先级大于 ? 此题等价于: 'Value is true' ? 'Something' : 'Nothing' 所以结果是:'Something' */ var val = 'smtg'; console.log('Value is ' +

javascript 面试题

面试题: 1.下面代码运行结果 var bl = false; $.ajax(url, { //... success: function(){ bl = true; } }); while ( !bl ) { alert( bl ); } alert( bl ); // 结果大家自己去想,这道题是面试官临时写的,简单直接,很好的考察你是否理解javascript中的运行机制,很棒的一道面试题 2.扩展Array原型,编写一个去除数组重复项的方法 // 算法一,两层循环,性能差 Array.pr

Javascript面试题浅析

分享几道JavaScript相关的面试题. 字符串反转 这这里提供了两种解题思路.如果各位读者还有其他的思路,可以分享交流! 第一方法: function reverse(str){ var sp = str.split(','); //保存反转之后的字符串 var new_str = ''; /*从后往前取,用逗号分隔*/ for(var i = sp.length-1;i>=0;i--){ new_str += sp[i]+','; } /*取到length-1,否则会取到最后一个逗号.*/

一道 JavaScript 面试题

有一道 JavaScript 面试题. f = function () { return true; }; g = function () { return false; }; (function() { if (g() && [] == ![]) { f = function () { return false; }; function g() { return true; } } })(); console.info(f()); 首先看前两行 var f = function () {

小猿圈之2019年前端JavaScript面试题(二)

小猿圈前端讲师今天继续给你总结js面试题,前面一篇文章咱们已经有一片js基础部分面试题,今天小猿圈web讲师为你讲解js前端应用设计问题,一定要好好看哦,为了能赢在其他人前面. JavaScript前端应用设计问题 1.解释单向数据流和双向数据绑定. Angular1.x基于双向数据绑定,而React,Vue,Elm等基于单向数据流架构. 2.单向数据流架构在哪些方面适合MVC? MVC拥有大约50年的悠久历史,并已演变为MVP,MVVM和MV*.两者之间的相互关系是什么?如果MVC是架构模式,

每天一个JavaScript实例-html5拖拽

<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <title>每天一个JavaScript实例-html5拖拽</title> <style> #drop{ width:300px; height:200px; background-

如何成为一个javascript高手【转载】

原文网址: http://www.cnblogs.com/keva/p/how-to-become-a-javascript-badass.html 英文网址:http://www.clientcide.com/deep-thoughts/how-to-become-a-javascript-badass/ 上周我写了一篇相当漫长的文章,感叹要找到一个有天分的前端开发人员是相当具有挑战性的.这篇文章引起了一些评论和电子邮件形式的讨论,我不只是想要在这里抱怨这种客观事实而是想要对该现状发表一下个人