JavaScript中的关键字“VAR”使用详解

2023-11-18

JavaScript的变量也是有作用域的,只是它非常的笼统,就分为全局变量和函数变量。作为全局变量的时候,有没有var 都没有关系,但是,在function中,有var就表示是局部变量,没有var就表示是全局变量。

JScript的语法教程里面说在声明变量时忽略var要害字是完全合法的。但是事实经常又证实想当然的结果是不可靠的。
  看看下面这几个例子的结果就知道问题了:
  
  <script language="javascript">
  var var00 = 0;
  document.write(var00 + '<br>');
  var var01 = 1;
  function foo()
  {
  document.write(var01);
  var var01 = 1;
  }
  foo();
  </script>
  
  <script language="Javascript">
  var00 = 0;
  document.write(var00 + '<br>');
  var01 = 1;
  function foo()
  {
  document.write(var01);
  var01 = 1;
  }
  foo();
  </script>
  
  <script language="javascript">
  var00 = 0;
  document.write(var00 + '<br>');
  var01 = 1;
  function foo()
  {
  document.write(var01);
  var var01 = 1;
  }
  foo();
  </script>
  这三个例子的执行结果分别是:
  
  Results#region Results
  No.1
  0
  undefined
  No.2
  0
  1
  No.3
  0
  undefined
  #endregion
  原来JavaScript的变量也是有作用域的,只是它非常的笼统,就分为全局变量和函数变量。在第二个例子中得到0和1,是因为所有的变量都是全局变量,而且那个语句块一共就定义了两个变量。而第一个第三的函数外全局变量,确实说明var要害字有没有都没有关系。而函数内的var要害字就很要害了,它说明第二个var01是函数内的变量,所以在初始化var01前输出自然就是'undefined'了。
  那么函数里面是不是就屏蔽掉了全局的var01了呢?我们知道在C/C++可以使用::去访问全局变量,那么JavaScript可不可以呢?这里其实我们只要明白了全局变量到底是什么东西,就好弄了。原来全局变量都是动态添加到Window对象的实例window上的属性而以,所以我们只要在函数内用:document.write(window.var01);就可以取到其值1了。同时在这个上下文中,function内的this也是指向的window实例,我们也可以把引用写成:this.var01。
  顺便说一下,重看JScript教程时,它说变量只能是[a-zA-Z_]+[a-zA-Z0-9_]*格式,可是'$'却也可以作为变量名字符,而且还可以用在开头,比如:$1234,更甚至于:$$$ 也是合法的变量名,faint。
  <script type="text/javascript">
  <!--
  //这样写js的语句块更好一些:)
  -->
  </script>
  我想知道是不是.在调用一个函数时,程序执行顺序会先检查函数内部变量中,有没有要害字var. 然后中再根据检查结果给不同的变量付予不同的作用域和变量值.因为我看到在这三个函数中,var01变量都是在输出语句之后.
  function get_global_var(___name)
  {
  return eval(___name);
  }
  function set_global_var(___name,___value)
  {
  eval(___name+"=___value");
  }
  var aa=11;
  Test();
  WScript.Echo(aa);//22
  function Test()
  {
  var aa=33;
  WScript.Echo(get_global_var("aa"));//11
  set_global_var("aa",22);
  WScript.Echo(get_global_var("aa"));//22
  WScript.Echo(aa);//33
  }
  在上面的例子中this从来就没有指过Test,而一直都是WScript的实例。
  假如我们写一个语句:var test = new Test(); 这时Test里的this就是指的Test的一个实例了,这个实例中假如要使用Global的变量,Lostinet给出的是一个方法。
  不过最简单还是把global传入对象,这样定义Test:
  function Test(global)
  {
  // ...
  }

 

 

JScript的语法教程里面说在声明变量时忽略var要害字是完全合法的。但是事实经常又证实想当然的结果是不可靠的。看看下面这几个例子的结果就知道问题了: <script language="javascript"> var var00 = 0; document.write(var00 + '<br>'); var var01 = 1; function foo() { document.write(var01); var var01 = 1; } foo(); </script> <script language="Javascript"> var00 = 0; document.write(var00 + '<br>'); var01 = 1; function foo() { document.write(var01); var01 = 1; } foo(); </script> <script language="javascript"> var00 = 0; document.write(var00 + '<br>'); var01 = 1; function foo() { document.write(var01); var var01 = 1; } foo(); </script> 这三个例子的执行结果分别是: Results#region Results No.1 0 undefined No.2 0 1 No.3 0 undefined #endregion 原来JavaScript的变量也是有作用域的,只是它非常的笼统,就分为全局变量和函数变量。在第二个例子中得到0和1,是因为所有的变量都是全局变量,而且那个语句块一共就定义了两个变量。而第一个第三的函数外全局变量,确实说明var要害字有没有都没有关系。而函数内的var要害字就很要害了,它说明第二个var01是函数内的变量,所以在初始化var01前输出自然就是'undefined'了。那么函数里面是不是就屏蔽掉了全局的var01了呢?我们知道在C/C++可以使用::去访问全局变量,那么JavaScript可不可以呢?这里其实我们只要明白了全局变量到底是什么东西,就好弄了。原来全局变量都是动态添加到Window对象的实例window上的属性而以,所以我们只要在函数内用:document.write(window.var01);就可以取到其值1了。同时在这个上下文中,function内的this也是指向的window实例,我们也可以把引用写成:this.var01。 顺便说一下,重看JScript教程时,它说变量只能是[a-zA-Z_]+[a-zA-Z0-9_]*格式,可是'$'却也可以作为变量名字符,而且还可以用在开头,比如:$1234,更甚至于:$$$ 也是合法的变量名,faint。 <script type="text/javascript"> <!-- //这样写js的语句块更好一些:) --> </script> 我想知道是不是.在调用一个函数时,程序执行顺序会先检查函数内部变量中,有没有要害字var. 然后中再根据检查结果给不同的变量付予不同的作用域和变量值.因为我看到在这三个函数中,var01变量都是在输出语句之后. function get_global_var(___name) { return eval(___name); } function set_global_var(___name,___value) { eval(___name+"=___value"); } var aa=11; Test(); WScript.Echo(aa);//22 function Test() { var aa=33; WScript.Echo(get_global_var("aa"));//11 set_global_var("aa",22); WScript.Echo(get_global_var("aa"));//22 WScript.Echo(aa);//33 } 在上面的例子中this从来就没有指过Test,而一直都是WScript的实例。 假如我们写一个语句:var test = new Test(); 这时Test里的this就是指的Test的一个实例了,这个实例中假如要使用Global的变量,Lostinet给出的是一个方法。 不过最简单还是把global传入对象,这样定义Test: function Test(global) { // ... }

 

<script type="text/javascript"></script>

 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JavaScript中的关键字“VAR”使用详解 的相关文章

  • 为什么 Eclipse 有时会对 JavaScript 中的数组数组发出警告?

    在 Eclipse 中 以下 JavaScript 行 var a1 1 2 3 4 生成警告 Type mismatch cannot convert from Number to any Type mismatch cannot con
  • VB.NET - 类中的扩展函数?

    我正在尝试创建一个类库 其中包含将二进制整数转换为十进制的函数 反之亦然 这样我就可以将其导入到另一个项目中 而无需重写该函数 它工作得很好 这是课程的一部分 Public Class BinaryDenary Public Shared
  • 如何用js获取一个月的4个星期一?

    我正在构建一个图表 其中 x 轴应该是一个月的四个星期 我只想显示该月的四个星期一 我已经有了currentMonth和currentYear变量 而且我知道如何获取该月的第一天 我所需要的只是将一个月的四个星期一放入数组中 所有这些都在同
  • 当名称是数组时如何使用 Javascript 修改 HTML Select

    我有两个同名的 html select 对象 它们是具有不同索引的数组 我想做的是 如果从类别 0 选择元素中选择 关闭 我想禁用类别 1 元素 我一直在尝试使用 document getElementsByName 但无法弄清楚如何专门针
  • 如何删除事件监听器?

    下面是我的事件监听器代码 window addEventListener beforeunload function e if sessionStorage token abide call api 如果我想删除这个事件监听器 我该怎么办
  • 使用javascript在谷歌地图中绘制多边形

    我想在谷歌地图中绘制多边形 我正在使用示例代码http jsfiddle net rvsMH 1 http jsfiddle net rvsMH 1 但它不起作用并且没有获取数组或纬度 经度值 我不知道出了什么问题
  • jqgrid 在编辑框中选择不正确的下拉选项值

    我正在使用表单编辑 表单中有两个选择框 一个选择框是国家 地区 另一个选择框是州 州选择框取决于所选的国家 地区 并将动态填充 例如 Country 美国 期权价值 1 英国 期权价值 2 美国的状态 阿拉巴马州 选项值 1 加利福尼亚州
  • 如何处理 d3 中 Beeswarm 图中的碰撞?

    我一直在玩这个例子here https gf neocities org co2bs co2bee html一会儿 我想做的是突出显示图中的单个节点 圆圈 通过使用边框使其变大 稍后我也想在其中添加文本或字母 目前 我已经圈了Bhutan图
  • 有什么方法可以在不重新加载的情况下更改标头 URL? [复制]

    这个问题在这里已经有答案了 可能的重复 修改URL而不重新加载页面 https stackoverflow com questions 824349 modify the url without reloading the page 使用新
  • JQuery 可排序嵌套可排序 div

    这个问题与这个有关Nest jQuery UI 可排序 https stackoverflow com questions 19129476 nest jquery ui sortables 但我无法解决我的问题 问题是 我有一个包含项目的
  • Hydrate with RTK Query 确实会抛出错误

    我有一个非常简单的组件来显示来自本地 API 的数据 使用 Nextjs API 路由制作 我使用 RTK 查询来获取数据 const api createApi reducerPath data baseQuery fetchBaseQu
  • 将 ESLint 与 Airbnb 样式和选项卡结合使用 (React.js)

    我正在开发一个 React js 应用程序 并且正在尝试检查我的代码 我将 ESLint 与 Airbnb 风格一起使用 但出现以下错误 src Test jsx 4 2 error Unexpected tab character no
  • 测量填写部分的时间 - 谷歌表单

    我正在尝试使用谷歌表单进行研究调查问卷 对于某些部分 我想自动测量用户填写所需的时间 谷歌表单中没有这样的选项 我尝试复制表单源 并用 javascript 填充时间 但它不起作用 跨源问题 未能成功托管复制的表单 如何做到 我如何衡量回答
  • 将数字限制为段的最优雅的方法是什么?

    比方说x a and b是数字 我需要限制x到段的边界 a b 换句话说 我需要一个钳位功能 https math stackexchange com q 1336636 clamp x max a min x b 有人能想出一个更易读的版
  • Jquery获取每个div的子子div并将信息抓取到数组中

    我有一些看起来像这样的 html div div class sub main div div
  • Skrollr 添加空白

    我已经尝试了一切 我在谷歌上阅读了 4 5 页试图找到适合我的修复程序 已经筋疲力尽了 即使我使用 skrollr 示例 我的问题仍然存在 不是说他们做错了什么 我知道我只是没有正确理解它 因此 我上传了一个演示 仅在移动设备上展示这个尴尬
  • 使用 Javascript 检测 Pepper (PPAPI) Flash

    我们使用的是专有的文档查看器 它与某些 Chrome 版本中的 Pepper 版本的 Flash 配合得不太好 所以我希望能够检测到它并重定向到不同格式的相同内容 由于这个版本似乎落后于 NPAPI 版本 所以我一直在使用闪光检测 http
  • 如何在 WebView 中添加 JavaScript 函数并稍后在提交 reCAPTCHA 时从 HTML 调用它

    我在 WebView 中添加一个 JavaScript 函数 如下所示 Kotlin val webView findViewById R id webview as WebView webView getSettings setJavaS
  • 如何用时刻找到与给定时间最接近的时间?

    所以我有一个简单的代码 一个工作代码 它使用 moment 获取最接近给定时间的时间 Current time in millis const now moment 10 16 HH mm format x List of times co
  • 将 javascript 变量作为参数传递给 @url.Action()

    是否可以将javascript变量作为参数传递给 url Action 因为据我所知可能存在服务器和客户端问题 我的要求是我必须根据过滤器下载文件 并进行ajax调用不适用于下载文件 所以我对 url Action 进行了编码 但无法实现这

随机推荐