原来JScript中的关键字'var'还是有文章的 (zt)

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情
都不记得是什么时候看的JScript的语法教程了,里面说在声明变量时忽略 var关键字是完全合法的。当时也因为觉得JavaScript是loosely-typed的语言,所以var可能真的就是个摆设。但是事实常常又证明想当然的结果是不可靠的

    看看下面这几个例子的结果就知道问题了:

    No.1

 

 

< script  language ="javascript" >
var var00 = 0;
document.write(var00 
+ '<br>');

var var01 = 1;
function foo()
{
    document.write(var01); 
    
var var01 = 1;
}

foo();
</ script >

 


    No.2

 

< script  language ="javascript" >
var00 
= 0;
document.write(var00 
+ '<br>');

var01 
= 1;
function foo()
{
    document.write(var01); 
    var01 
= 1;
}

foo();
</ script >

 


    No.3

 

< script  language ="javascript" >
var00 
= 0;
document.write(var00 
+ '<br>');

var01 
= 1;
function foo()
{
    document.write(var01); 
    
var var01 = 1;
}

foo();
</ script >

 


    这三个例子的执行结果分别是:

 

#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。

    By the way, 重看JScript教程时,它说变量只能是[a-zA-Z_]+[a-zA-Z0-9_]*格式,可是'$'却也可以作为变量名字符,而且还可以用在开头,比如:$1234,更甚至于:$$$ 也是合法的变量名,faint。

posted on 2005-01-26 23:32 birdshome 阅读(2537) 评论(19)  编辑 收藏 收藏至365Key 所属分类: JScript&DHTML开发

# re: 原来JScript中的关键字'var'还是有文章的  回复   

哦,还有这样的说法阿
2005-01-27 03:15 | robaggio

# re: 原来JScript中的关键字'var'还是有文章的  回复   

兄台,如果Js没有运行于IE宿主上的时候全局变量如何处理的呢?

我先试试啊。
2005-01-27 09:05 |

# re: 原来JScript中的关键字'var'还是有文章的  回复   

如下,怎样在foo中取得foo外面的tmp?

var  tmp  =   1 ;

function  foo()
{
    
var  tmp  =   2 ;
    
return  tmp;
}

WScript.Echo(
" foo: "   +  foo());
WScript.Echo(
" global: "   +  tmp);
2005-01-27 09:15 |

# re: 原来JScript中的关键字'var'还是有文章的  回复   

我想知道是不是.在调用一个函数时,程序执行顺序会先检查函数内部变量中,有没有关键字var. 然后中再根据检查结果给不同的变量付予不同的作用域和变量值.因为我看到在这三个函数中,var01变量都是在输出语句之后.
2005-01-27 09:39 | 自由哥哥之青春不老哥

# re: 原来JScript中的关键字'var'还是有文章的  回复   



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
}


更多的可以参考我的一篇老文章:
http://www.csdn.com.cn/web/2088.htm
2005-01-27 09:47 | Lostinet

# re: 原来JScript中的关键字'var'还是有文章的  回复   

......看来除了这种方法没啥其他的了,不知楼主有啥想法。
2005-01-27 11:25 |

# re: 原来JScript中的关键字'var'还是有文章的  回复   

var aa=11;
Test();
WScript.Echo(aa);//22

function Test()
{
  var aa=33;
  WScript.Echo(this.aa);//11
  this.aa = 22;
  WScript.Echo(this.aa);//22
  WScript.Echo(aa);//33
}
2005-01-27 11:48 | birdshome

# re: 原来JScript中的关键字'var'还是有文章的  回复   

var aa=11;
Test();
WScript.Echo(aa);//22

function Test()
{
  var aa=33;
  WScript.Echo(this.aa);//11
  this.aa = 22;
  WScript.Echo(this.aa);//22
  WScript.Echo(aa);//33
}

WScript.Echo(new Test().aa);


这是何解呢?真被Script搞糊涂了。这样一说那个this又指Test,又指global了?
2005-01-28 09:52 |

# re: 原来JScript中的关键字'var'还是有文章的  回复   

  在上面的例子中this从来就没有指过Test,而一直都是WScript的实例。
  如果我们写一个语句:var test = new Test(); 这时Test里的this就是指的Test的一个实例了,这个实例中如果要使用Global的变量,Lostinet给出的是一个方法。
  不过最简单还是把global传入对象,这样定义Test:
  function Test(global)
  {
    // ...
  }
  然后这样创建实例:var test = new Test(this); 就可以在Test实例中使用global的对象和属性了。
2005-01-28 10:53 | birdshome

# re: 原来JScript中的关键字'var'还是有文章的  回复   

是不是这样,在new的实例中,this就指实例,否则都指WScript?
 
如果这样的话,换了脚本引擎,是不是情况又会不同?这个是标准吗?
2005-01-31 12:04 |

# re: 原来JScript中的关键字'var'还是有文章的  回复   

new constructor[(arguments)];
new 运算符执行下面的任务:
·创建一个没有成员的对象。
·为那个对象调用构造函数,传递一个指针给新创建的对象作为 this 指针。
·然后构造函数根据传递给它的参数初始化该对象。

要注意的是即使当前作用域内没有调用new,但可能在其父作用域里是调用了new的,所以“在new的实例中,this就指实例,否则都指WScript?”,前半句对,而后半句不一定。
2005-01-31 12:16 | birdshome

# re: 原来JScript中的关键字'var'还是有文章的  回复   

btw: Lostinet 推荐的他写的那篇文章很有看头,强烈推荐
2005-01-31 12:17 | birdshome

# re: 原来JScript中的关键字'var'还是有文章的  回复   

如下,怎样在foo中取得foo外面的tmp?


获取全局的 tmp

window.tmp
2005-02-16 18:27 | boynannan

# JavaScript中this关键字使用方法详解[TrackBack]  回复   

Ping Back来自:blog.csdn.net
Dicky引用了该文章,地址: http://blog.csdn.net/applebbs/archive/2005/03/07/313121.aspx
2005-03-07 00:22 | Dicky

# re: 原来JScript中的关键字'var'还是有文章的  回复   

它有局部和整体之分
个人认为还是不忽视为佳
2005-06-06 18:14 | 鬼吧

# re: 原来JScript中的关键字'var'还是有文章的  回复   

<script language="javascript">
var00 = 0;
document.write(var00 + '<br>');

var01 = 1;
function foo()
{
document.write(var01);

}
foo();
</script>
这就就显示
0
1
<script language="javascript">
var00 = 0;
document.write(var00 + '<br>');

var01 = 1;
function foo()
{
document.write(var01);

}
foo();
</script>
这就显示
0
undefined
2005-07-06 16:39 | 孙玉婷

# re: 原来JScript中的关键字'var'还是有文章的  回复   

就如楼主的列子,比如第一个和第三个,我想是不是因为在function中,是不允许定义函数的,比如在第一个列子中,
function foo()
{document.write(var01);
var var01;
}
我觉得,只所以他输出是显示undefined,是因为那个function把输出语句后面的那个
---var ar01 当成了一个变量,而这个变量很明显在前面是没有定义的,所以,他会显示undefined,而第二个之所以会显示正确的数据,就是因为在他的function内,所有的变量都是前面定义过的,他只是拿过来用,当然是没有错的。由此,我估计是不是在function内是不能再定义新的变量的,只能使用原来的???
2005-08-14 00:38 | phornic

# JavaScript中this关键字使用方法详解[TrackBack]  回复   

Ping Back来自:blog.csdn.net
抽烟的猫引用了该文章,地址: http://blog.csdn.net/haluomao/archive/2005/10/12/500954.aspx
2005-10-12 17:24 | 抽烟的猫
#  re: 原来JScript中的关键字'var'还是有文章的   回复   
PyTorch LSTM API参数详解:从原理到实战配置指南 长短期记忆网络(LSTM)作为循环神经网络(RNN)的重要变体,通过门控机制有效解决了传统RNN在处理长序列时的梯度消失问题。其核心原理包含输入门、遗忘门和输出门三个关键组件,能够选择性记忆和遗忘信息。在深度学习工程实践中,PyTorch的LSTM API提供了高度优化的实现,但参数配置直接影响模型性能。hidden_size决定了模型的表达能力,需要根据数据规模平衡过拟合和欠拟合;num_layers控制网络深度,多层LSTM能学习更复杂特征但需配合dropout防止过拟合。这些参数的技术价值体现在文本分 阅读详情

相关推荐

武士 (Samurai) 第三人称游戏 Three.js 开源

这是一个浏览器中的第三人称动作场景 使用Three.js和Vite构建 无引擎、无物理库、无资源管线 特色:完整骨骼绑定武士模型、程序化夜间景观、战斗系统(踢击/斩击/滑斩)、三个特殊技能(影分身/天罚/飞刃)、布娃娃死亡效果、燃烧基于Three.js与Vite构建的第三人称武士动作模板。浏览器中呈现完整动作场景:绑定骨骼的武士立于程序化夜景,具备运动系统、三类近战招式、影分身等技能、布娃娃死亡、燃烧武士刀及装备工作室。项目无外部引擎与物理库,所有数值与招式均存放在配置文件中,可实时编辑,架构完全解耦。

a111776的博客 391

JavaScript 原型链与原型对象详解

<think>我们只需要根据内容生成摘要,≤150字。内容是关于JavaScript原型链与原型对象详解。摘要要简洁概括核心:原型解决共享内存,构造函数/实例/原型关系,原型链查找,函数原型链等。注意字数。</think>JavaScript原型链通过共享原型对象解决方法重复占用内存的问题。构造函数有显式prototype,实例有隐式__proto__,两者关联形成原型链。属性查找沿链进行,直至Object.prototype。函数本身也是对象,其__proto__指向Function.prototype。

2501_92542211的博客 199

SQLite 通用操作工具 (SL-SqlLite.js)

基于 uni-app plus.sqlite 的 Promise 化 SQLite 操作工具,仅支持 App(5+) 环境。非 App 环境(H5 / 小程序)调用任何方法会自动 reject 并弹窗提示。

weixin_45381071的博客 225

Nodejs部署项目踩坑: PM2 显示 online,服务却一直无法真正启动

使用Bun+PM2部署Elysia后端到移动云ECS时遇到的“假online”问题:PM2显示进程正常,但服务端口无法访问。问题根源是云主机的“半残双栈IPv6”——有IPv6地址但公网IPv6不通,导致Bun等运行时优先尝试IPv6连接时卡在SYN-SENT状态,阻塞了服务启动。解决方案是彻底关闭IPv6或确保公网IPv6真正可用,并提供了自检命令和配置方法。核心警示:进程存活不等于服务就绪,坏的双栈比纯IPv4更麻烦。

梅山老妖的博客 244

企业微信客服场景告别手动切号:Spring Boot + Vue 把多账号会话聚合到一个窗口

企业微信客服工作台如何把多号会话、回调落库和 WebSocket 实时推送聚到一个独立窗口?本文基于 Spring Boot + Vue 的现网实现,拆解单例窗口、在线打网关/离线读库的会话列表、WebSocket 优先轮询兜底的实时通道,以及人工发送自动暂停 AI 的人机边界,并给出 Nginx 升级、离线兜底等落地清单。

WXID_Mrzhu0107的博客 157

前端内存泄漏治理:全链路保障页面长期运行内存稳定

本文系统剖析了单页应用中内存泄漏的成因与危害,涵盖事件监听、定时器、闭包、全局缓存等常见场景,提出“绑定与清理成对”的预防原则,并通过AbortController、WeakMap、LRU缓存等技术实现全链路治理。结合代码规范与自动化检查,构建可落地的内存稳定保障体系,确保页面长期运行性能不退化。

webFrontEndDev的博客 240

WebView 完整篇:从嵌入浏览器到JS Bridge,覆盖Android / iOS / 桌面三大端

WebView 完整篇:从嵌入浏览器到 JS Bridge,覆盖 Android / iOS / 桌面三大端 做混合应用或「套壳」工具时,最先碰到的词是 **WebView**:在原生窗口里嵌一个浏览器引擎,用 HTML/CSS/JS 画界面,必要时再和原生代码通话。很多人把它等同于「打开一个网页」,结果在权限、进程、更新、安全上踩坑。 本文把 **WebView 是什么、和系统浏览器有何不同、各平台实现、与原生通信、安全与性能** 讲全,并落到 Android、iOS/macOS、Windows、Linu

qq_35223473的博客 134

Vue 2 + Electron 从零到打包成 .exe 完整配置示例

本文详细介绍Vue2与Electron 17.4.0集成的完整配置流程,涵盖环境准备(推荐Node.js 16.x及nvm管理)、路由模式改为hash、Vite/VueCLI资源路径配置(base/publicPath设为'./'),主进程入口文件创建与开发/生产环境启动脚本设置。重点说明跨进程通信(IPC)、窗口控制、系统托盘及文件对话框等API使用,并提供打包优化建议与常见问题解决方案,确保项目稳定运行与高效分发。

qq_37004501的博客 108

JS/TS 易踩坑知识点 — 自动分号插入(ASI)

场景错误写法正确写法return 换行return\n{}return {}函数表达式前let x = 1;数组/对象前let a = 1;[1,2,3]模板字符串前hello``let x = 1;hello``通用规则依赖 ASI始终显式写分号 + ESLint。

weixin_49523082的博客 172

浏览器也能跑本地 AI:用 Transformers.js + WebGPU 做一个最小推理 Demo,cpolar 给同事远程体验

本文用 Transformers.js 在浏览器中跑一个 WebGPU 优先、WASM 降级的最小本地推理 Demo,再用 cpolar 临时分享静态体验页,重点区分 Hugging Face kernels 与浏览器端 Transformers.js 的职责。

qq_63013137的博客 322

Vue3 零基础每日笔记(011):生命周期钩子——在正确的时间做正确的事

组件和人一样有完整的一生:出生(创建挂载)→ 成长(更新)→ 离世(卸载)。在每个关键节点,你都能"注册一个动作":挂载后发请求、卸载前清定时器。这些节点就是生命周期钩子。写代码最容易犯的错就是"时机不对"——页面还 没 DOM 就去操作它。今天把时机一次理顺。

陈志宝‑天津|Android&Java 全栈开发工程师 571

想转GIS开发,企业会卡专业背景吗?

再看,湖南省水利水电勘测设计规划研究总院的GIS开发岗,明确要求"学历硕士研究生及以上,专业:地图学与地理信息系统、测绘工程"。——专业、学历是硬门槛,但也没有完全卡死,岗位名称换一换、专业范围松一松,有编程能力和项目经验的人照样有机会。PostGIS、GeoServer这些后端空间数据处理能力,虽然不是所有岗位都要求,但有的话会是明显的加分项,尤其是涉及到数据管理和发布的岗位。以青岛蓝色地球大数据科技有限公司为例,它们的GIS开发岗JD写着:"测绘、GIS、计算机等相关专业背景,学历要求没写。

2401_84715637的博客 197

$nextTick 演示demo

$nextTick 演示demo

weixin_46597615的博客 238

前端动画体系全解析:类型、实现方案与工程选型最佳实践

很多开发者对前端动画的认知停留在「视觉装饰」层面,觉得可有可无。但实际上,动画是前端交互体验的核心组成部分它能平滑状态切换,避免界面生硬跳转,降低用户的认知割裂感;它能提供操作反馈,让用户明确感知到「我的操作生效了」;它能引导用户注意力,提示关键操作、解释状态变化;它能提升感知性能,加载、等待场景的动画会让用户觉得时间更短。前端动画不是单一技术,而是一套完整的体系:从最简单的 CSS 过渡,到复杂的物理仿真、3D 动效,不同场景对应完全不同的实现方案。

m0_51089660的博客 149

第三十四节:用户新增编辑弹窗增加 el‑tree‑select 部门选择器

目标:在用户弹窗里实现下拉树形选择部门,新增 / 编辑用户可以绑定部门 deptId,提交保存到接口。,下拉框内嵌树形组件。

qq_36158551的博客 193

基于SpringBoot的旅游系统的设计与实现

【2026最新】基于Java+SpringBoo+Vue+MySQL的旅游系统的设计与实现

计算机学姐的博客 308

一些常用名词

它本身不干活,它只是把你"想要什么"和"条件是什么"打包成一个规范的请求包,递交给能干活的那个系统。query:搜索引擎里输入的那串文字,在AI和API的语境里,Query = "带参数的调用指令"CoT:把Ai工具的思考透明化,失败的一般都是因为幻觉,全靠脑子想,想错了没人纠正。description:工具描述,给Ai看的工具使用说明书。ReAct:思考不仅透明化,他还要去现实验证。

qq_40458575的博客 215

外包项目管理平台全栈实战课02搭建数据底座:Next.js + PostgreSQL + Prisma 7

上一课,我们先没有急着写代码,而是把整个系统看了一遍。我们最终要做的,不是一个简单的 CRUD 后台,而是一套完整的外包项目管理平台。登录认证组织与员工角色与权限工作流客户管理商机管理合同管理项目管理项目预算里程碑任务执行质量管理运维管理附件管理数据。例如:“部门管理”其实是在管理部门数据。“员工管理”是在管理员工数据。“客户管理”是在管理客户数据。“合同管理”是在管理合同数据。“项目管理”是在管理项目数据。这些数据到底存在哪里?

低代码布道师的博客 293
下一篇: 在JavaScript中也玩变量类型强行转换
prodigynonsense
博客等级 码龄21年 2粉丝 5原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值