百科问答小站 logo
百科问答小站 font logo



为什么vscode中,js代码打开谷歌浏览器会弹出提示窗口? 第1页

  

user avatar   jibang-ding 网友的相关建议: 
      

能问出这种问题,那说一堆乱七八糟的名词也没用了,无意中翻到这个问题就想到我初学之路的艰辛hhh,于是怒答一发,我知道这时候你肯定什么也不懂,纯萌新嘛,所以我不会阴阳怪气嘲讽不懂的你,相反我会用比较生动的方式给你解答下,可以当做你初学路上的一个休闲小知识小插曲


首先你问《为什么vscode中,js代码打开谷歌浏览器会弹出提示窗口?》

看你报错的图,这个问题和vscode与谷歌浏览器都没一点关系

这个框是哪来的?其实背后充满故事,我先讲讲故事,最后在给你讲讲这个报错框是怎么回事


在Windows电脑里你随便在某个地方新建个txt里面写上几句js代码,把后缀名改成.js然后你发现都可以双击运行。

那是什么运行了你的脚本呢?当然不是chrome,也不是别的,而是windows自带了个解释器,能执行你这段js——你在几乎任何一个windows电脑里都能建个js然后双击运行它。

windows自带了套脚本执行系统(WSH),可以用来写一些系统脚本,运行一些自动化的小东西(比如可以给朋友写个小脚本,当他玩游戏检测到游戏进程弹窗警告还有10秒电脑关机结果真关机了然后被朋友暴打一顿)


而这个脚本执行系统为啥能运行你的js?因为它支持这门语言啊!不过它支持的的并不是你认知中的那个叫JavaScript的语言,而是叫JScript。

这是一个远古历史遗留产物(可以追溯到windows 95那个年代),名字听起来和JavaScript差不多嘛——确实差不多,JScript你可以理解为JavaScript的方言。

上个世纪那个蛮荒年代,当年最流行的浏览器是网景(Netscape)浏览器,他们的浏览器里就有了JavaScript这门语言用来让浏览器做更多“动态”的事情,这也是你即将要学JavaScript的原因,浏览器不能光有图片文字,还得有交互对吧。

后来微软酸啊!看着网景浏览器用户那么多,微软寻思我也整个浏览器,于是大名鼎鼎(臭名昭著hhh)的IE就诞生了。起初,IE浏览器里写脚本不用JScript,也不是JavaScript,而是VBScript,这也是一个很有故事的脚本语言,以后有机会再讲。但那时候网上冲浪,大家都用最潮最IN的网景浏览器,网站开发者也只给网景浏览器开发适配的网站,你IE整个我不认识的脚本语言,我凭啥要多学一门语言来适应你IE浏览器,问题是你IE浏览器也没人用,你寄吧谁啊?

这时候IE后来也想明白了,要想蹭网景浏览器的热度首先我得先把它的JavaScript搞到手,于是微软想了各种办法(据说还反编译了网景浏览器的脚本内核),自己实现了个跟JavaScript差不多的东西,起名为JScript,似乎是微软不想也叫JavaScript是因为里面带java这个词,怕打官司之类的嫌麻烦,干脆起个避嫌的名字,又或许微软想特立独行一点,你网景浏览器叫这个名,我偏不!

但这个JScript最开始也瘸腿,各种问题各种BUG,而作为创造者的网景浏览器同样也不愿意了,你这多少有点剽窃我啊,于是网景浏览器把自己的JavaScript发到了一个国际标准组织(就和ISO一样),组织名字叫ECMA,这就像你发明了牛逼的东西总要申请专利一样,于是JavaScript顺理成章的变成了一种标准,这样我网景浏览器听着也牛逼,可以有个“国际标准创始人”的头衔了,你微软也不过是个“我的标准的另一种实现者”,听着像不像个小弟了,我的小弟是微软,倍有面儿!

没办法,微软想在浏览器这个桌子上打牌,也必须顺应这个标准,于是在这之后的JScript就很贴近JavaScript了。那具体JScript和JavaScript有什么区别呢?有一点,但是不多,有兴趣可以自己搜索下,你基本可以认为是差不多的东西,毕竟都是顺应ECMA标准的,在这之上我比你多一点方言都无所谓的。

在这之后网景浏览器被微软IE反杀的故事就有机会再讲吧,我们继续重点在这个JScript上。这个时候JScript这个语言还是给浏览器打工的,就和你认知里的“js”是一个玩意,负责给浏览器增加动态效果,后来微软寻思这个语言也不能光做这个。刚才说到,windows系统里有个WSH,就是自带的脚本解释系统,可以写一些小脚本——WSH你可以理解成一个底层引擎,在这之上可以运行多种语言的实现,于是JScript也顺理成章的加入到WSH大军,意思就是——你的“js”不但可以在浏览器里运行,如果放到桌面上双击——就像是打开一个.exe软件一样,运行它的就不是浏览器而是你的系统了,它会执行你js里的代码,这样你就可以做到很多浏览器里做不到的事情,比如让你的系统做各种事情。


所以,这也就是上面说的,这和你用chrome还是vscode一点关系都没有,你以为你双击,chrome就会运行这段JavaScript,首先chrome不会莫名其妙直接运行一个js文件,js归根到底是给网页服务的,它必须在html里以<script>标签方式引入或内嵌,先有html后有js,你先有个页面,才能在这之上做事情对吧(对萌新的教育口气hhh!,其实是因为你双击时,是windows内置的WSH把它当JScript运行了,和浏览器没关系,在这之上你要有个认知是,语言是语言,和它的平台没关系,js在浏览器里运行它是js,在WSH里运行它还是内个js,语言没变,语法没变,那什么变了呢?


简单来说,浏览器和WSH是两个不同的“宿主”,js本身就是一大串文本,需要有人翻译这个文本然后执行他们,那翻译并执行的这个玩意就是宿主了,每个宿主最终做的事情不一样,浏览器的宿主是为了让你的js能给html产生交互,而WSH的宿主目的是让你的js能运行一些系统的事物,那你有一段本应该是给浏览器运行的js代码——点击按钮后让网页背景变成红色,你把这段代码硬生生让WSH去运行,你觉得WSH会明白吗,“按钮”是什么鬼,“红色”又是啥,我只知道怎么运行EXE,怎么把你盘里的小〇片删掉;反过来你让一段本身是给WSH运行的脚本——比如一段格式化D盘的JScript脚本,你让浏览器去执行,浏览器要是能执行那岂不是乱套了,你打开任何一个恶意网站都能把你D盘格式化让你电脑关机,你觉得有可能吗


这背后都因为,每个宿主提供了一些“独有”的东西,就像是浏览器里的宿主,他独有一个window对象,借助它你可以操作网页里的元素,可以改变网页背景颜色,可以window.alert(),可以window.document.getElementById()……你的console.log()也是window对象里的一个成员,而WSH没有window对象,所以它不认识console.log,故给你报错“console”未定义。

(小知识:在WSH里如果你想打印东西到控制台,可以用WScript.Echo(str)的方式)


到这为止就破案了,你不能直接双击一个本来是给浏览器用的js,这样会让WSH把它当成JScript运行并且产生误会,其次刚才帮你捋了下js的存在意义和关系,以后你要记住浏览器里的js是为了一个网页服务的,你试图让chrome单独打开个js,那chrome怎么知道你这个js是给哪个“网页”用的嘛

最后希望你能好好学习吧,今天只是随便说说最浅层的东西,刚才讲了WSH和浏览器两个宿主,其实这个世界里还有第三个最常用的宿主叫nodejs,那个离现在的你太遥远了,不过当你开始知道并了解nodejs时候,你的前端宇宙噩梦

才 刚 刚 开 始




  

相关话题

  JavaScript(V8,Node) 的开发效率比 Java(JVM,Vert.x) 高在哪里? 
  请问一下各位大佬,js的静态方法有啥作用呀,写工具类吗,小菜鸡想不出来静态方法有啥作用? 
  有多大比例的前端工程师,能在合理的时间内独立开发出一个足以供商业网站使用的文本编辑器? 
  JavaScript 如果拥有多线程能力会怎样? 
  为什么 Chrome 下不能用 JavaScript 复制到剪贴板? 
  Mac 上最好的浏览器是什么? 
  你极力推荐的 Chrome 扩展有哪些? 
  为什么 Chrome 下不能用 JavaScript 复制到剪贴板? 
  如何看待前端的响应式编程,后台有类似的实现吗? 
  TypeScript 不适合在 vue 业务开发中使用吗? 

前一个讨论
最适合编程的笔记本电脑是什么?
下一个讨论
为什么“山上架着炮”有歧义,而“车上装着酒”没有歧义?





© 2025-01-31 - tinynew.org. All Rights Reserved.
© 2025-01-31 - tinynew.org. 保留所有权利