为什么弹出的是“外面”,而不是“内部”?
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>行间事件测试</title>
<style>
*{margin: 0; padding: 0;}
div{width: 300px; height: 40px;
border: 2px solid orange;
}
span{background: lime;}
</style>
</head>
<body>
<div>
</div>
<script>
// 获取到div节点
var oD=document.body.children[0];
// 变量temp 存着字符串“外面”
var temp='外面';
// 定义一个函数f
function f(){
// 局部变量temp 保存着'内部'
var temp='内部';
oD.innerHTML='<span onclick="obj.m(temp)">js代码添加的</span>';
}
// 定义一个对象 及 它的方法
var obj={};
obj.m=function(type){
alert(type);
};
// 调用f
f();
</script>
</body>
</html>
附图:
你这样写,实际上在调用obj.m这个方法的时候 f函数内部的作用域已经被销毁了,内部temp变量已经不存在了。要形成闭包需要内部函数保存外部函数的引用,
'<span onclick="obj.m(temp)">
js代码添加的</span>',这样的写法在onclick调用之前obj.m就只是一个字符串。你可以把obj.m这个对象和方法都放到函数内部声明。你会发现会报错 obj对象不存在。要保存f函数内部temp变量不被销毁。你需要在调用事件处理器时引用它。代码@getAnswer (楼上)已经贴出来了。