在下面这段js代码中,为什么这里不把btn声明为window.btn,onclick 点击事件就不能奏效呢?

如代码所示,button按钮是js动态生成的,btn(i)是onclick事件执行的函数。实际过程中我只有加了window.btn=btn;按钮点击事件才有效果,请问这是... 如代码所示,button按钮是js动态生成的,btn(i)是onclick事件执行的函数。实际过程中我只有加了 window.btn =btn; 按钮点击事件才有效果,请问这是为什么?
(function($, $w){
"use strict";
$(document).ready(function(){
requestExcel();
});
function requestExcel(){
var BASE_URI = '/mydemo/data/excel',

$.ajax({
type:"post",
url:URI_GROUP,
data:{},
success:function(resp){
add(resp.excelContent,resp.sheetNum,resp.sheetName);
btn(0);
}
});
}
//添加Excel内容及按钮
function add(excelContent,sheetNumber,sheetNameStr){
var addHtml= excelContent;
$(document.body).append(addHtml);
var sheetNum = sheetNumber;
var sheetNames = new Array();
sheetNames = sheetNameStr.split("||");
var sheetName;
for(var i = 0;i < sheetNum;i++){
sheetName = sheetNames[i];
var addbtn = '<input type="button" id="button'+i+'"'+' onclick="btn('+i+')"' +'value="'+sheetName+'"'+' style="cursor: pointer; />';
$("#btnSel").append(addbtn);
}
}
//按钮控制
function btn(i) {
$('body #div' + i).css('display', 'block');
$("div:not('#div" + i + "')").css('display', 'none');
}
window.btn =btn;
})(jQuery, window);
展开
 我来答
miaoch
2017-04-28 · TA获得超过1204个赞
知道小有建树答主
回答量:814
采纳率:83%
帮助的人:344万
展开全部

注意到这里有一个匿名函数,这里是模仿块级作用域的写法。

在这个区域内声明的方法是属于该区域而不属于window的。


而节点的onclick事件的作用域是在window,也就是说会如果要访问btn函数,就会去window对象里面找。如果你不设置window.btn =btn;那自然就找不到这个函数了。

其实你也可以写成$w.btn = btn;

你可以试试下面的代码:

(function () {
    function hello() {
        alert("hello");
    }
})();
hello();//无效 hello is not defined
追问

谢谢,但是仍然有两个疑问。

  1. 您所说的“模仿块级作用域的写法”是不是说作用域是 (function($,$w){})(jQuery, window);  这个作用域不在window对象下?

  2. onclick事件的默认作用域是在window对象下吗?

    谢谢!

推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式