一个初级的JS变量作用域问题

customevalidator 2009-11-09 04:47:20
var test=1;

1.在页面中直接写出来,可以alert(test)出来,
2.保存在外部1.js文件中,在页面中进行引用也可以alert(test)出来

3.
用a=document.createElement('script');
a.setAttribute("type","text/javascript");
a.src="1.js"; //1.js即外部JS
document.body.appendChild(a);

这种方式就不能调用test了


向大家寻求一下问题所在。谢谢你们了。
...全文
112 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
moliu 2009-12-21
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 wwy_0918 的回复:]

<html>
<head> </head>
<body>
<script>
function f1()
{var a=document.createElement('script');
a.setAttribute("type","text/javascript");
a.src="1.js";
document.body.appendChild(a);
alert(test);
}
f1(); //变量test在函数的作用域内即当前产生的调用对象中是不存在的
</script>
</body>
</html>

直接写的 <scriptsrc="1.js"> </script> <script>alert(test); </script>
是没问题的//而直接写,alert函数和test变量就都在全局作用域内是可以引用的。

----变量作用域的问题,我第一次如此明白的理解了,注意到了。谢谢

moliu 2009-12-21
  • 打赏
  • 举报
回复
谈笑有鸿儒往来无白丁
customevalidator 2009-11-09
  • 打赏
  • 举报
回复
谢谢wwy_0918,可惜结贴了,有机会补你分。谢谢谢谢
wwy_0918 2009-11-09
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 customevalidator 的回复:]
比如这样:

HTML code<html><head></head><body><script>function f1()
{var a=document.createElement('script');
a.setAttribute("type","text/javascript");
a.src="1.js";
document.body.appendChild(a);
alert(test);
}
f1();</script></body></html>

直接写的<scriptsrc="1.js"></script><script>alert(test);</script>
是没问题的
[/Quote]

像这种方式中,在调用函数f1的时候,变量test在函数的作用域内即当前产生的调用对象中是不存在的。而直接写,alert函数和test变量就都在全局作用域内是可以引用的。
customevalidator 2009-11-09
  • 打赏
  • 举报
回复
TO:yixianggao

谢谢你,问题解决了。:)
customevalidator 2009-11-09
  • 打赏
  • 举报
回复
TO WWY_0918:

外部引入,如果直接写<script src="1.js">是可以的,而document.createElement('script')不行,可能是顺序问题,思考解决办法ing。
yixianggao 2009-11-09
  • 打赏
  • 举报
回复
Web 开发常用手册

JScript语言参考.rar
http://download.csdn.net/source/308916

DHTML参考手册.rar —— DEFER Attribute | defer Property
http://download.csdn.net/source/308913

样式表中文手册.chm
http://download.csdn.net/source/304124
yixianggao 2009-11-09
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 customevalidator 的回复:]
恩,可能我没表述清楚,alert是在html里面的,不是js文件里,
简单的说就是htm访问不到createElement('script')方式声明的变量。

还是感谢您的回复
[/Quote]
呵呵,为 script 增加延迟执行标记 defer!

L@_@K

1.js
var test=1;


1.html
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title> new document </title>
<meta name="generator" content="editplus" />
<meta name="author" content="" />
<meta name="keywords" content="" />
<meta name="description" content="" />
</head>

<body>
<script type="text/javascript" defer>
<!--
var a=document.createElement('script');
a.setAttribute("type","text/javascript");
a.src="1.js"; //1.js即外部JS
document.body.appendChild(a);

alert(test);
//-->
</script>
</body>
</html>
wwy_0918 2009-11-09
  • 打赏
  • 举报
回复
客户端JavaScript对JavaScript代码的解释执行是有顺序的,页面上的代码顺序优先级最高,外部引入的最低
customevalidator 2009-11-09
  • 打赏
  • 举报
回复
比如这样:


<html>
<head>
</head>
<body>
<script>
function f1()
{
var a=document.createElement('script');
a.setAttribute("type","text/javascript");
a.src="1.js";
document.body.appendChild(a);
alert(test);
}
f1();
</script>
</body>
</html>

直接写的<script src="1.js"></script><script>alert(test);</script>
是没问题的
customevalidator 2009-11-09
  • 打赏
  • 举报
回复
恩,可能我没表述清楚,alert是在html里面的,不是js文件里,
简单的说就是htm访问不到createElement('script')方式声明的变量。

还是感谢您的回复
yixianggao 2009-11-09
  • 打赏
  • 举报
回复
注意,1.js 与 1.html 要放在同一目录下!

L@_@K

1.js
var test=1;
alert(test);


1.html
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title> new document </title>
<meta name="generator" content="editplus" />
<meta name="author" content="" />
<meta name="keywords" content="" />
<meta name="description" content="" />
</head>

<body>
<script type="text/javascript">
<!--
var a=document.createElement('script');
a.setAttribute("type","text/javascript");
a.src="1.js"; //1.js即外部JS
document.body.appendChild(a);
//-->
</script>
</body>
</html>
内容概要:本文深入解析了JavaScript中的作用域作用域链与闭包三大核心概念。首先介绍了作用域的基本类型,包括全局作用域、函数作用域和ES6引入的块级作用域,并对比了var、let和const在作用域行为上的差异。接着详细阐述了作用域链的构成及其在变量查找中的机制,强调了词法作用域的特点。文章重点剖析了闭包的定义、形成条件(函数嵌套、内部函数引用外部变量、内部函数被外部引用)以及其在数据私有化、函数工厂、事件处理、模块模式等实际场景中的应用。同时,指出了闭包可能带来的内存泄漏问题和常见陷阱,如循环中闭包的错误使用,并提供了优化建议。最后探讨了现代JavaScript中let/const和箭头函数对作用域与闭包的影响。; 适合人群:具备JavaScript基础语法知识,正在深入学习前端开发的初级到中级开发者,尤其是对闭包、作用域链等概念理解不清的程序员。; 使用场景及目标:①深入理解JavaScript作用域机制和变量查找流程;②掌握闭包的原理、应用场景及潜在风险;③解决实际开发中因作用域和闭包导致的bug,如循环绑定事件错误、内存泄漏等问题;④学习如何利用闭包实现模块化和私有变量封装。; 阅读建议:此资源理论结合代码示例,建议边阅读边动手实践文中提供的代码片段,重点关注作用域链的查找过程和闭包的形成机制,特别注意对比var与let/const的行为差异,以及箭头函数对this和闭包的影响,从而全面掌握JavaScript的核心运行机制。

87,993

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧