js Maximum call stack size exceeded

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title></title>
	<meta charset="utf-8" />
    <script src="../jquery.js"></script>
    <script>
        $(function () {

            // 测试 null的指向

            var func = function () {
                // 说明当call 的第一个参数为null是, 指向是window ,
                //console.log(arguments);
                //console.log(this);
                //console.log(this == window);
                //Array.prototype.join.apply(null, arguments);
                //console.log(arguments);
            }

            //func.call(null, 1, 2, 3);
            var funs = function (args) {
                //console.log(args);
            };

            func.apply(funs, [1, 2, 3]);

            // 解决方案
            document.getElementById = (function(func) {
                return function () {
                    return func.apply(document, arguments);
                }
            })(document.getElementById);
               
            var getId = document.getElementById;
            console.log(getId('demo'));
            
            //document.getElementById.apply(document, 'demo');    //会栈溢出,



            /* 
            该实例输出的结果是   Maximum call stack size exceeded
            document.getElementById = (function () {
                return function(){
                    return document.getElementById.apply(document, arguments);
                }
            })();
                
                //var getIdss = document.getElementById;
                //console.log(getIdss('demo'));
            */


            /* 简化模型  输出结果为 Maximum call stack size exceeded */
            /*
            (function a() {
                a();
            })();

            */

            /*
                问题说明:
                1   栈溢出的错误原因是 : 重复的调用了匿名函数, 
                    79L : 函数在调用后, document.getElementById 函数被改写,
                    76L : 函数调用的不再是 原来的document.getElementById,

                    简化后的函数体

                    document.getElementById= function(){
                        return document.getElementById.apply(document,argument);
                    }
                    在执行 document.getElementById() 后, 函数开始自己调用自己了, 


                    // 简化模式, 如果这么调用也会出现 栈溢出的问题,
                     var a = function () {
                            return a.apply(window, arguments);
                        }
                        a();


                    解决问题的思路 :   参考结局方案.
                    在运行时  func 为一个函数  getElementById(){};
                  
            */

                /*
                document.getElementById = (function () {
                    return  function() {
                        return document.getElementById.apply(window, arguments);
                    }
                })();

                var getId = document.getElementById;
                console.log(getId('demo'));
                */

        });

    </script>
</head>
<body>
    <div id="demo">demo</div>
</body>
</html>

 

转载于:https://my.oschina.net/u/1579560/blog/838764

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值