李世海
  • 1
  • 新人请关照

闭包里的变量问题

QQ截图20200326144454.png

不懂为什么是undefined,赋值不成功### 问题描述

问题出现的环境背景及自己尝试过哪些方法

火狐浏览器,
没尝试过解决
不理解为什么会这样

相关代码

粘贴代码文本(请勿用截图)

var options = {
                    url:'./server/register.php',
                    method:'post',
                    async:true,
                    params:{userpwd:'123321'},
                    error:function (){
                    },
                    success:function (data){
                        console.log(data);
                    }
                }
                $.ajax(options);

var $ = {
    ajax:function (options) {
        var url = options.url;
        if (!url){
            return fales;
        }
        var method = options.method || 'get',
            async = options.method?true:false,
            callback = options.success || null,
            error = options.error || null,
            params = options.params,
            xhr = createXHR(),
            paramsStr = (function (){
                var temp = params;
                var result = '';
                for (var i in paramsStr){

                    result += i+"="+temp[i]+"&";
                }
                    result.replace(/&$/,'');
                console.log(result);
                return result
            })();
        console.log(options.params);
        debugger
        xhr.onreadystatechange = function (){
            if (xhr.readyState == 4){
                if (xhr.status >=200 && xhr.status <300 || xhr.status == 304){
                    callback && callback(JSON.parse(xhr.responseText));
                }
            }else{
                error && error();
            }
        }
        xhr.open(method,url,async);

        if(method === 'get'){
            url += "?"+paramsStr;
            xhr.send(null);
        }else{
            debugger
            xhr.setRequestHeader('content-type','application/x-www-form-urlencoded');
            xhr.send(paramsStr);
        }


        function createXHR() {
            // 如果是IE7以上和其他浏览器,则存在XMLHttpRequest本对象,通过它创建
            if (typeof XMLHttpRequest != undefined) {
                return new XMLHttpRequest;
            } else if (typeof ActiveXObject != undefined) {
                // 将所有ActiveXObject的版本号列出
                var verNumber = ['Microsoft.XMLHTTP', 'MSXML2.XMLHTTP.6.0', 'MSXML2.XMLHTTP.5.0',
                    'MSXML2.XMLHTTP.4.0', 'MSXML2.XMLHTTP.3.0', 'MSXML2.XMLHTTP.2.0'];
                // 遍历创建XMLHttpRequest对象
                var len = verNumber.length;
                for (var i; i < len; i++) {
                    try {
                        var xhr = new ActiveXObject(verNumber[i]);
                        break;
                    } catch (e) {

                    }
                    return xhr;
                }
            } else {
                throw new Error('No XHR Object availabel.');
            }
        }


    }
}

你期待的结果是什么?实际看到的错误信息又是什么?

获得那个params的对象

阅读 224
评论 3月26日提问
    2 个回答
    paramsStr = (function(params➊) {
        var temp = params;
        var result = '';
        for (var i in paramsStr) {
    
            result += i + "=" + temp[i] + "&";
        }
        result.replace(/&$/, '');
        console.log(result);
        return result
    })(options.params➊);
    • ➊ 将上下文的params传入,如果params未定义,则传入的值为undefined


    这个问题在于对以下语句的理解上了

    paramsStr = (function() {
       // 应该避免使用上下文变量
    })();

    如果想获取上下文的变量params,则需要这样:

    var params = 'hebut';
    paramsStr = (function(a) {
        console.log(a);
    })(params);

    image.png

    评论 赞赏 3月26日