【问题标题】:Javascript Object: a function or method in an attributeJavascript Object:属性中的函数或方法
【发布时间】:2011-12-09 09:13:58
【问题描述】:

我正在尝试将方法的结果放入属性中,但我不断收到错误消息:“Uncaught TypeError: Object [object DOMWindow] has no method 'ppp'”

这是我的简单代码:

var ttt = {
    ddd: 'I said '+ this.ppp() + '!!!',


    ppp:function(){
        return 'ok';
    }
};
alert(ttt.ddd)

感谢您的帮助:)

【问题讨论】:

    标签: javascript object methods attributes


    【解决方案1】:
    var ttt = {
        ddd:function(){
            return  'I said '+ this.ppp() + '!!!';
        },
    
    
        ppp:function(){
            return 'ok';
        }
    };
    alert(ttt.ddd())
    

    没关系。你写的代码,ttt.ddd是一个字符串,'this'是浏览器中的window对象。

    【讨论】:

    • 谢谢大家,也就是说我们不能将方法返回的值放入对象内的属性中。我将转向方法解决方案干杯
    • 只有函数才能在javascript中创建新的作用域。
    【解决方案2】:

    javascript 中没有块作用域(只有函数作用域),所以 this.ppp() 指的是全局作用域(这意味着它将在窗口对象上查找 ppp ),因为它不在函数内部。

    你可以改写如下:

    var ttt = (function () {
        var innerttt = {
            ddd: function () {
                return 'I said ' + this.ppp() + '!!!';
            },
            ppp: function(){
                return 'ok';
            }
        };
    
        return innerttt;
    })();
    
    alert(ttt.ddd())
    

    这将为 ddd 提供调用 ppp 所需的范围。这意味着 this.ppp( ) 将在函数内部查找 ppp

    有关范围和关闭的更多信息..http://robertnyman.com/2008/10/09/explaining-javascript-scope-and-closures/

    【讨论】:

    • 将整个东西包装在一个闭包中的意义何在?它似乎在没有关闭的情况下工作。
    • @Dogbert 你说得对,我误读了这个问题,答案过于复杂! allenm 的答案是这个特定问题的更好答案
    • 这是一个看起来不错的解决方案,但它确实将 ddd 从属性更改为函数,这不需要发生。
    【解决方案3】:

    问题是在你的代码中'this'指的是窗口对象。

    为了解决这个问题,你可以把 ttt 变成一个自动执行的函数

    var ttt = function() {
    function ppp(){
         return 'ok'   
    }
    
    return {
        ddd: 'I said '+ ppp() + '!!!',
        ppp: ppp
    }
    }();
    

    此时你仍然可以使用你原来的代码来提醒 ddd

    alert(ttt.ddd)
    

    要查看实际情况,请转至http://jsfiddle.net/aCeqt/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-10-25
      • 2015-04-17
      • 1970-01-01
      • 2013-04-03
      • 2019-09-13
      • 2020-12-03
      • 1970-01-01
      相关资源
      最近更新 更多