Javascript 为什么我的对象中的函数返回未定义?

Javascript 为什么我的对象中的函数返回未定义?,javascript,object,Javascript,Object,考虑以下代码: var MSE = { Module : {} }; MSE.Module = (function() { 'use-strict'; var app = { tabsPre : function() { var tabsPre = { init : function() { }, changeTab : fu

考虑以下代码:

var MSE = {
    Module : {}
};

MSE.Module = (function() {

    'use-strict';

    var app = {

        tabsPre : function() {

            var tabsPre = {
                init : function() {

                },
                changeTab : function(arg) {
                    return arg;
                }
            };

            tabsPre.init();
            return tabsPre;
        }
    };

    return app;

})();

console.log( MSE.Module.tabsPre() );
console.log( MSE.Module.tabsPre().changeTab() ); // undefined
console.log( MSE.Module.tabsPre.changeTab() ); // Uncaught TypeError: MSE.Module.tabsPre.changeTab is not a function
我正在尝试访问
tabsPre
对象中的
changeTab()
,但似乎无法访问。最后两个
console.log
语句并没有给我我所希望的结果。我该怎么做

下面是一个JSFIDLE:

在第一个
console.log
中,我可以看到函数存在:

任何关于我做错了什么的帮助或指导都会很好。我可能有一天很无聊,看不见

谢谢,
Mikey

ChangeTab返回传递给它的参数,它打印未定义,因为您没有传递任何参数,请尝试:

console.log(MSE.Module.tabsPre().changeTab("args"))  //"args"
changeTab()
函数需要一个参数。然后,代码返回调用后传递的参数。由于没有传递参数,因此返回
undefined

尝试传递参数:)

这将记录要返回的tabsPre对象

console.log( MSE.Module.tabsPre().changeTab() );
这将记录
MSE.Module.tabsPre().changeTab()
的结果,该结果是
未定义的
,因为您没有传递参数

console.log( MSE.Module.tabsPre.changeTab() );

这会导致一个错误,因为
MSE.Module.tabsPre
是一个函数,因此您无法访问它的属性,因为它们不存在JavaScript没有检查参数的数量

假设我有一个方法,比如说
add
,定义如下:

function add(arg1, arg2){

}
我以3种不同的方式调用此方法,假设:

1) add(1,2)   // Works just fine

2) add(1,2,3) // My third argument is ignored.

3) add(1)    // 2nd expected parameter is taken to be `undefined`
您的问题是场景3


您的
changeTab
方法需要一个参数。如果在调用
changeTab
时没有传递任何消息,则会看到
undefined

tabsPre
是一个函数。为什么希望
MSE.Module.tabsPre.changeTab()
工作?
changeTab
需要一个参数。因此,您的第二个控制台是
未定义的
。将任何参数传递给它,比如
MSE.Module.tabsPre().changeTab(1)
尝试任何事情……甚至愚蠢的事情。让init为
tabsPre()
返回一些值,以防您不执行
changeTab()
1) add(1,2)   // Works just fine

2) add(1,2,3) // My third argument is ignored.

3) add(1)    // 2nd expected parameter is taken to be `undefined`