javascript - 关于js自执行函数报错的问题
怪我咯
怪我咯 2017-04-11 11:51:01
[JavaScript讨论组]
var kim = kim || {};
    kim.prototype = {
        init : function (obj, i) {
            console.log('Hello World')
        },

        closeWindow : function (obj1, obj2) {
            obj1.onclick = function () {
                obj2.style.display = "none"
            }
        }
    }

//调用

function lala(){
    var First = document.querySelector('.first'),
        firstBody = document.querySelector('.first_body'),
        Btn = document.querySelector('.btn'),
        btnBody = document.querySelector('.btnbody');
    var myFunc = kim.prototype;
    myFunc.init(First, firstBody);
    myFunc.closeWindow(Btn, btnBody);
}
lala();

这么调用没问题,但是写成以下自执行函数就报错

(function(){
    var First = document.querySelector('.first'),
        firstBody = document.querySelector('.first_body'),
        Btn = document.querySelector('.btn'),
        btnBody = document.querySelector('.btnbody');
    var myFunc = kim.prototype;
    myFunc.init(First, firstBody);
    myFunc.closeWindow(Btn, btnBody);
})()

新手不知道什么原理?不吝赐教,谢谢了

怪我咯
怪我咯

走同样的路,发现不同的人生

全部回复(5)
高洛峰

IIFE前面最好加上分号;

;(function(){
    var First = document.querySelector('.first'),
        firstBody = document.querySelector('.first_body'),
        Btn = document.querySelector('.btn'),
        btnBody = document.querySelector('.btnbody');
    var myFunc = kim.prototype;
    myFunc.init(First, firstBody);
    myFunc.closeWindow(Btn, btnBody);
})()

原因就在于代码压缩之后会出现以下情况:

// obj <obj>
var a = obj(function () {})()

这样就成了obj调用,就会报错,加上了分号

// obj <obj>
var a = obj;(function () {})();

这种尴尬就没有啦

PHPz

var kim = kim || {};
    kim.prototype = {
        init : function (obj, i) {
            console.log('Hello World')
        },

        closeWindow : function (obj1, obj2) {
            obj1.onclick = function () {
                obj2.style.display = "none"
            }
        }
    }

后面加上分号。我估计是把后面的自调用的()当成传参数什么了。需要再确认一下。

PHP中文网

我感觉问题可能是出现在没有等网页加载完成再去执行.你把你的那个自动执行的行数写在

$(funciton(){
    '你的自动执行函数';
});
黄舟

分号真的好吝啬……

建议把documentkim传进IIFE里试试,写成这样:

(function(document, kim){
//blablabla...
})(document, kim)
阿神

估计这是JS的【变量提升】搞的鬼。
可以这样简单理解:

无论你变量或函数在什么地方定义,解析器都会默认将它们插放到当前作用域的最顶部,所以形象的叫它做“变量提升”。

这是我个人对这个概念形象的理解,希望对你有帮助

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号