`

javascript中return的设计缺陷

阅读更多

代码1:

<script>
var gisService = (function(window) 
{ 

    return
    {
        name:function ()
        {
            alert(1);
        }
    };

})(this);

gisService.name();
</script>

        这种写法没有什么问题呀,尤其是对java开发人员来说,java中我们一般会采用这种大括号对齐的方式编写java的类或者函数。但是这段javascript代码在Chrome下会报错:Uncaught SyntaxError: Unexpected token ( 。

 

代码2:

<script>
var gisService = (function(window) 
{ 

    return {
        name:function ()
        {
            alert(1);
        }
    };

})(this);

gisService.name();
</script>

        代码2与代码1几乎是一模一样的,唯一的差别在于return后面的大括号。但是代码2可以在chrome下正常运行。不知道这是什么原因,不过很显然这是javascript设计上的缺陷,因为代码1和代码2仅仅是格式化和排版不一样。

 

代码3:

<script>
var gisService = (function(window) 
{ 
    function name()
    {
        alert(1);
    }


    return  
    {
        name:name
    };


})(this);

gisService.name();
</script>

        chrome下运行代码3会报错:Uncaught TypeError: Cannot read property ‘name’ of undefined。

        javascript有一个自动修复机制——在程序可能有缺陷的时候,自动插入分号补全,但这个机制很不靠谱,常常会掩盖一些错误。比如:

return {
    hello:"world";
};

        正常的理解是返回一个字面量构成的对象。但是如果这么写:

return
{
    hello:"world"
};

        javascript的自动补全会将上面代码变成:

return;
{
    hello:"world"
};

        实际返回一个undefined,这种错误不会有任何提示。知道这个自动补全机制后,就不难理解为什么代码3会报错了。

        下面几种定义函数的方式,只有方式1是错误的。这也可以解释为啥代码1会报错了。

// 方式1:错误
{
    name:function(){

    }
};

// 方式2:正确
var obj = 
{
    name:function(){

    }
};
//方式3:正确
({
    name:function(){

    }
});

//方式4:正确
function name()
{

}

{
    name:name
};

 

文章来源:http://blog.csdn.net/aitangyong/article/details/44066295

分享到:
评论

相关推荐

    Javascript for in的缺陷总结

    Javascript for in的缺陷总结 for in 语句用来列举对象的属性(成员),如下 var obj = { name:"jack", getName:function(){return this.name} }; //输出name,getName for(var atr in obj) { alert&#40;atr&#41;; }...

    utils:javascript的utils

    但是这个代码有点小缺陷,就是不支持预编译,这里加了2行代码使它能够支持预编译; var newFun=new Function(code.replace(/[\r\t\n]/g, '')); return options?newFun.apply(options):function(options){return ...

    javascript-tips:Javascript技巧

    Javascript技巧有缺陷的数学0.1 + 0.2!= 0.3 0.1 + 0.2 == 0.30000000000000004 console.log(0.1+0.2);简单的变量可以被复制并将是新的 var x = 1;var y = x;x = 2;console.log(x,y);结果:x = 2,y = 1复杂变量...

    calendar日历文本框插件

    1、 Calendar:.net自带的一种日期显示控件,唯一的缺陷就是每次对日历进行操作的时候都会造成回传, 所以效果不是很好 2、 js版的日历控件-My97DatePicker: &lt;title&gt;&lt;/title&gt; ...

    RSA+bcpkix-jdk15.zip

    缺陷:由于进行的都是大数计算,使得RSA最快的情况也比DES慢上100倍,无论 是软件还是硬件实现。所以一般来说只用于少量数据 加密。 下面我们就来一个实际的例子: 1、前端加密需要引入Barrett.js、BigInt.js和...

    图库新版jQuery焦点图 JS代码

    tips[44] = '设计有两种方法:一种是简单到明显没有缺陷,另一种复杂到缺陷不那么明显。—— 托尼·霍尔'; tips[45] = '广告创意不要超越大多数人的智商,否则会落得无人问津。'; tips[46] = '没人能拥有所有的答案...

    esm-pkg:查找带有ESM输出的所有相关软件包

    这通常用于webpack和babel-loader的组合,因为webpack可以识别软件包的ESM版本,并且我们必须手动将这些模块包含在babel-loader中才能进行转换。 使用esm-pkg,这可以更容易,并且即使使用其他支持ESM的软件包更新...

    scoreunder:重新排序函数的前两个参数以使下划线或 lodash 更实用

    和是伟大的图书馆,但他们有微小的缺陷:他们首先把数据和回调第二。 这种参数顺序使得组合函数变得非常困难。 Scoreunder提供了微小的实用功能来解决这个问题。 // underscore / lodash function isPositive ( a...

    PHP和MySQL WEB开发(第4版)

    5.9 使用Return关键字 5.9.1 从函数返回一个值 5.10 实现递归 5.10.1 名称空间 5.11 进一步学习 5.12 下一章 第6章 面向对象的PHP 6.1 理解面向对象的概念 6.1.1 类和对象 6.1.2 多态性 6.1.3 继承 6.2 在PHP中...

    PHP和MySQL Web开发第4版pdf以及源码

    5.9 使用Return关键字 5.9.1 从函数返回一个值 5.10 实现递归 5.10.1 名称空间 5.11 进一步学习 5.12 下一章 第6章 面向对象的PHP 6.1 理解面向对象的概念 6.1.1 类和对象 6.1.2 多态性 6.1.3 继承 6.2 ...

    PHP和MySQL Web开发第4版

    5.9 使用Return关键字 5.9.1 从函数返回一个值 5.10 实现递归 5.10.1 名称空间 5.11 进一步学习 5.12 下一章 第6章 面向对象的PHP 6.1 理解面向对象的概念 6.1.1 类和对象 6.1.2 多态性 6.1.3 继承 6.2 ...

Global site tag (gtag.js) - Google Analytics