栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

如何避免JavaScript中的全局变量?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

如何避免JavaScript中的全局变量?

最简单的方法是将代码包装在闭包中,然后仅将全局所需的那些变量手动公开给全局范围:

(function() {    // Your pre here    // Expose to global    window['varName'] = varName;})();

为了解决Crescent Fresh的评论:为了从场景中完全删除全局变量,开发人员将需要更改问题中假设的许多内容。它看起来像这样:

Javascript:

(function() {    var addEvent = function(element, type, method) {        if('addEventListener' in element) { element.addEventListener(type, method, false);        } else if('attachEvent' in element) { element.attachEvent('on' + type, method);        // If addEventListener and attachEvent are both unavailable,        // use inline events. This should never happen.        } else if('on' + type in element) { // If a previous inline event exists, preserve it. This isn't // tested, it may eat your baby var oldMethod = element['on' + type],     newMethod = function(e) {         oldMethod(e);         newMethod(e);     };        } else { element['on' + type] = method;        }    },        uploadCount = 0,        startUpload = function() { var fil = document.getElementById("FileUpload" + uploadCount); if(!fil || fil.value.length == 0) {         alert("Finished!");     document.forms[0].reset();     return; } disableAllFileInputs(); fil.disabled = false; alert("Uploading file " + uploadCount); document.forms[0].submit();        };    addEvent(window, 'load', function() {        var frm = document.forms[0];        frm.target = "postMe";        addEvent(frm, 'submit', function() { startUpload(); return false;        });    });    var iframe = document.getElementById('postHere');    addEvent(iframe, 'load', function() {        uploadCount++;        if(uploadCount > 1) { startUpload();        }    });})();

HTML:

<iframe src="test.htm" name="postHere" id="postHere"></iframe>

无需 在上使用内联事件处理程序

<iframe>
,它仍会在每次加载此代码时触发。

关于负载事件

这是一个测试案例,表明您不需要内联

onload
事件。这取决于引用同一服务器上的文件(/emptypage.php),否则您应该可以将其粘贴到页面中并运行它。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"><head>    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>    <title>untitled</title></head><body>    <script type="text/javascript" charset="utf-8">        (function() { var addEvent = function(element, type, method) {     if('addEventListener' in element) {         element.addEventListener(type, method, false);     } else if('attachEvent' in element) {         element.attachEvent('on' + type, method);         // If addEventListener and attachEvent are both unavailable,         // use inline events. This should never happen.     } else if('on' + type in element) {         // If a previous inline event exists, preserve it. This isn't         // tested, it may eat your baby         var oldMethod = element['on' + type],         newMethod = function(e) {  oldMethod(e);  newMethod(e);         };     } else {         element['on' + type] = method;     } }; // Work around IE 6/7 bug where form submission targets // a new window instead of the iframe. SO suggestion here: // http://stackoverflow.com/q/875650 var iframe; try {     iframe = document.createElement('<iframe name="postHere">'); } catch (e) {     iframe = document.createElement('iframe');     iframe.name = 'postHere'; } iframe.name = 'postHere'; iframe.id = 'postHere'; iframe.src = '/emptypage.php'; addEvent(iframe, 'load', function() {     alert('iframe load'); }); document.body.appendChild(iframe); var form = document.createElement('form'); form.target = 'postHere'; form.action = '/emptypage.php'; var submit = document.createElement('input'); submit.type = 'submit'; submit.value = 'Submit'; form.appendChild(submit); document.body.appendChild(form);        })();    </script></body></html>

每当我在Safari,Firefox,IE 6、7和8中单击“提交”按钮时,都会触发警报。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/411382.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号