深扒JS三目运算符的潜力 解决if...else局部作用域问题

  众所周知JavaScript是一个基于对象的语言,大家不要忘记另外一个层面,它是一门“函数式编程”语言。对的就是函数。很多从后台转过来的程序员(Java,C#等)对JS可谓深恶痛绝,我曾经就是其中一员。应为大家总想尝试像使用自己更熟悉的另一种语言一样来使用JS,然后发现JS并不像他们熟悉的那种语言。那是应为大家不了解JS函数的独特之处。

  • 函数是第一类型对象
  • 它门可以通过字面量进行创建
  • 它们可以赋值给变量,数组货其他对象的属性
  • 它们可以作为参数传递给其他函数
  • 它们可以作为函数的返回值进行返回
  • 它们可以拥有动态创建并赋值的属性

JavaScript中,函数拥有全部这些功能,也就是说可以像这门语言的其他对象一样使用。因此,我们说函数是第一型(first-class)对象。(此段文字摘抄于《JavaScript Ninja》第3.1章)

  好了,言归正传,回到我们今天的主题。

  第一个问题,JavaScript的作用域。对于前端开发者来说再熟悉不过,JS只为我们划分了 函数作用域 和 全局作用域。换句话说只要不是在函数中定义的就是全局作用域。下面我们来看一个例子

  

 1 if(false){
 2   var a = 5;
 3 }else{
 4   var b = 8;
 5 }
 6 function fn(){
 7   var c = 10;
 8   console.log(c);
 9 }
10 console.log(a); //undefined
11 console.log(b); //8
12 fn(); //10
13 console.log(c); // Err : c is not defined

  相信大家已经发现了这个问题。当if条件不满足时,JS引擎还是为我们申明了变量a。这里是引擎的预处理查找到关键字var将申明提升到了作用域顶部。由于if条件不满足导致赋值部分没有执行。这也证明了在JS中并没有"局部变量"这个说法,但是你可能会想说,es6不是有let吗?那么let在桌面端浏览器上是存在兼容问题的。所以也不适合在浏览器端使用。由于JS的函数具备 Immediately-Invoked Function Expression (IIFE) 特点。我发现了一个可以解决if...else局部变量的方法。

  如果你不知道什么IIFE那么请先去了解立即执行函数后再来阅读本文。

  首先请使用三目运算符(条件运算符)来代替你的if...else...

  

 1 if(5>3){
 2   // do something
 3 }else{
 4   // do something
 5 }
 6 /*将以上代码修改为*/
 7
 8 (5>3)?(function(){
 9        //true
10        //do something
11   })():(function(){
12     //false
13     //do something
14   })();

  三目运算符后的两个表达式使用了IIFE的方式来处理,代替了if...else...的代码块,并且function封闭了作用域,还可以传参。是不是看起来非常棒呢?加上返回值还可以配合赋值操作。

  随手写了一个小案例,无关事件,性能等问题。单纯探讨三目运算符。

  

原文地址:https://www.cnblogs.com/mhxy13867806343/p/8447124.html

时间: 2024-12-01 19:50:28

深扒JS三目运算符的潜力 解决if...else局部作用域问题的相关文章

今天和组内一起写代码时碰到了一个关于命名冲突的问题,最后用js命名空间的方法解决的。

//第一步,首先创建一个全局变量,可以放在自己的js方法库中方便以后用,这个就是用来注册命名空间的方法. ns = function(namespace){ var arr = namespace.split('.');  //将传入的字符串如"com.test.lzn"以'.'隔开做成一个数组 var strNamespace = ""; //这个是为了保存每一步循环进去的包名 for(var i=0;i<arr.length;i++) { if(i!=0)

js中ajax如何解决跨域请求

js中ajax如何解决跨域请求,在讲这个问题之前先解释几个名词 1.跨域请求 所有的浏览器都是同源策略,这个策略能保证页面脚本资源和cookie安全 ,浏览器隔离了来自不同源的请求,防上跨域不安全的操作. 跨域指的协议.域名.端口 有一个不同的情况下都是跨域 例:在本站点请求外站的数据是不允许的 //在本站点请求外站点的资源是不允许的 $(function () { $.ajax({ url: "http://127.0.0.1:14847/Web/jsonp.js", success

ecshop transport.js 和 jquery 冲突解决办法

您提供一个简单的解决transport.js 和 jquery 方法: 在 page_header.lbi 库文件中加入如下代码,注意操作顺序: 1.先导入transport.js  文件 {insert_scripts files='transport.js,utils.js'} 2.然后导入您网站使用的jquery文件 <script language="javascript" src="您的jquery存放路径"></script> 3

分享一个控制JS 浏览器缓存的解决办法。

 JS 缓存的问题一直都是我们又爱又恨的东西.也是我们比较头痛的问题, 一方面为了提高网站响应速度,减少服务器的负担,和节省带宽,将需要将静态资源缓存在客户端, 但是另一方面,当js 文件有改动的时候,如何快速的将客户端缓存的js文件都失效,这是非常头痛的问题. 以至于每次客户反馈问题的时候,我们第一个解决办法都是清理浏览器缓存. 那么如何解决呢. 1. 直接禁止全部的静态文件缓存 在html 头部加上如下代码: <META HTTP-EQUIV="pragma" CONTENT

.NET获取不到js写的cookie解决方法

今晚使用javascript设置一个来路的cookie,之后使用ASP.NET获取这个cookie值,发现ASP.NET获取不到JS设置的cookie值,真郁闷中,以下是JS写Cookie的代码: Code //写cookies functionsetCookie(name,value) { document.cookie=name"="escape(value)";";//设置的cookie关闭浏览即失效 } //JS设置来路写入到cookie setCookie

idea运行java项目js中文乱码如何解决

大家经常遇到乱码问题,我一般习惯性的把编码问题归结为两种: 编码层面的乱码:指的是那些需要修改项目内的代码或配置来解决的乱码问题,比如有的时候从数据库获取的数据是乱码.发送ajax请求时,获取到的数据乱码等,这种都需要进行新增或修改适当代码或配置来解决:    非编码层面的乱码:指的是那些修改项目外在的一些东西,比如服务器编码没有设置.开发环境中没有设置编码.开发工具编码问题等原因造就的乱码: 只要是出现了乱码,从上面两个角度采用排除法,一般乱码问题都会得到解决:首先判断是否是非编码层面的乱码,

js基础--javascript基础概念之变量与作用域

js基础--javascript基础概念之变量.作用域 javascript按照ECMA-262 的定义,变量与其他语言变量有所不同.js变量时松散的,不需要事先定义变量类型的.这使得他只是一个保存特定值的一个名称.变量与其数据类型可以在脚本的生命周期内改变. 还有明白几点: JavaScript的变量作用域是基于其特有的作用域链的,JavaScript没有块级作用域. 基本类型和引用类型的值 ECMAScript 的变量有两种不同的数据类型:分别是 基本数据类型值 和 引用类型值 : 基本数据

在iframe里调用parent.func()引出的js函数运行在它们被定义的作用域里,而不是它们被执行的作用域里

有个document里定义了一个函数func(),同时在document里嵌入了一个iframe,在这个iframe里调用父窗口的方法:parent.func(),本来我以为这个函数的运行环境是在这个iframe自己里面,测试发现虽然是在iframe里面调用的这个函数,但是运行环境依然是在父窗口里. 所以也验证了JS权威指南中的:js函数运行在它们被定义的作用域里,而不是它们被执行的作用域里. 又比如 var a=1; function f1(){console.log(a);}; functi

JS高级(三)--原型链、闭包、作用域、函数的四种调用方式

一.原型链(家族族谱) 概念:JS里面的对象可能会有父对象,父对象还会有父对象,.....祖先 根本:继承 属性:对象中几乎都会有一个__proto__属性,指向他的父对象 意义:可以实现让该对象访问到父对象中相关属性 根对象:Object.prototype var arr=[1,3,5] arr.__proto__:Array.prototype arr.__proto__.__proto__就是找到了根对象 function Animal(){} var cat=new Animal();