并返回字符串中的最后一个表达式或语句的值,

美高梅棋牌官网,Javascript函数中with,with函数方便用来引用某个对象中已有的属性,但是不能用来给对象添加属性,要给对象创建新的属性,下面通过代码给大家讲解。

前面的话

每种编程语言,其变量都有一定的有效范围,超过这个范围之后,变量就失效了,这就是变量的作用域。从数学的角度来看,就是自变量的域。

美高梅棋牌官网 1

  eval和with经常被嫌弃,好像它们的存在就是错误。在CSS中,表格被嫌弃,在网页中只是用表格来展示数据,而不是做布局,都可能被斥为不规范,矫枉过正。那关于eval和with到底是什么情况呢?本文将详细介绍eval()函数和with语句

作用域是变量的可访问范围,即作用域控制着变量与函数的可见性和生命周期。在 JavaScript 中, 对象和函数同样也是变量,变量在声明他们的函数体以及这个函数体嵌套的任意函数体内部都是有定义的。

js函数中with函数的用法分析

eval

一、静态作用域和动态作用域

  • 定义 方便用来引用某个对象中已有的属性,但是不能用来给对象添加属性 要给对象创建
  • 新的属性 必须明确的引用该对象

定义**
**

静态作用域

  eval()是一个全局函数,javascript通过eval()来解释运行由javascript源代码组成的字符串

是指声明的作用域是根据程序正文在编译时就确定的,也称为词法作用域。大多数现代程序设计语言都是采用静态作用域规则,JavaScript就是采用的这种作用域。
采用静态作用域的语言中,基本都是最内嵌套作用域规则:由一个声明引进的标识符在这个声明所在的作用域里可见,而且在其内部嵌套的每个作用域里也可见,除非它被嵌套于内部的对同名标识符的另一个声明所掩盖。
为了找到某个给定的标识符所引用的对象,应该在当前最内层作用域里查找。如果找到了一个声明,也就可以找到该标识符所引用的对象。否则我们就到直接的外层作用域里去查找,并继续向外顺序地检查外层作用域,直到到达程序的最外嵌套层次,也就是全局对象声明所在的作用域。如果在所有层次上都没有找到有关声明,那么这个程序就有错误。如下:

with statements
var result = eval('3+2');
console.log(result,typeof result);//5 'number' 
function cha(){
 var name = "xiao;"
 function chb() {
 function chc() {
 console.log(name);
 }
 } 
}

object:新的默认对象statements:一个或多个语句 oject是该语句的默认对象with 语句通常用来缩短特定情形下必须写的代码量。

用法

首先函数从chb()搜索有没有name的定义,然后继续一层一层的向上搜索,最后在cha()中搜到了name的定义,如果没有搜到,则会报错。

x = Math.cos(3 * Math.PI) + Math.sin(Math.LN10) y = Math.tan(14 * Math.E) with { x = cos + sin  y = tan} function valiadate_reauired

  eval()只有一个参数,如果传入的参数不是字符串,它直接返回这个参数。如果参数是字符串,它会把字符串当成javascript代码进行编译。如果编译失败则抛出一个语法错误(syntaxError)异常。如果编译成功,则开始执行这段代码,并返回字符串中的最后一个表达式或语句的值,如果最后一个表达式或语句没有值,则最终返回undefined。如果字符串抛出一个异常,这个异常将把该调用传递给eval()

2、动态作用域

with相当于一种速写方式 在指定的代码区域,通过节点名称就能调用对象普通写法:

var num = 1;
var str = 'test';
console.log(eval(num));//1
console.log(eval(str));//ReferenceError: test is not defined 
var strLong1 = 'var x = 1;var y = 2;';
console.log(eval(strLong1),x,y);//undefined 1 2
var strLong2 = 'var x = 1; x++;';
console.log(eval(strLong2),x);//1 2 

动态作用域的语言中,程序中某个变量所引用的对象是在程序运行时刻根据程序的控制流信息来确定的。

var car={ size: suv, color:yellow, money:1500 };//欢迎加入全栈开发交流圈一起学习交流:864305860

作用域

二、JavaScript的作用域

其他类调用

  eval()使用了调用它的变量作用域环境。也就是说,它查找变量的值和定义新变量和函数的操作和局部作用域中的代码完全一样

JavaScript中有两种作用域,分别为全局作用域和局部作用域。

function={ car car =new car(); car.size=suv; car.color=yellow; car.money=1500; }//欢迎加入全栈开发交流圈一起学习交流:864305860
var b = 2;
function foo(str,a){
eval(str);
console.log(a,b);
}
foo('var b = 3;',1);//1 3 

1、全局作用域(Global Scope)

使用with的写法:省去了car.

别名

在代码中任何位置都是有定义的。即使在html 页面中嵌套的一段js代码中定义了一个全局变量,在引用的js文件中仍能访问到该变量。这就很有可能会造成全局变量的污染。

with{size=suv; color=yellow; money=1500; }//欢迎加入全栈开发交流圈一起学习交流:864305860

  当通过别名调用时,eval()会将其字符串当做顶层的全局代码来执行。执行的代码可能会定义新的全局变量和全局函数,或者给全局变量赋值,但却不能使用或修改函数中的局部变量

以下三种情况的变量都会被视为全局变量
(1)最外层的函数和最外层的变量拥有全局作用域
(2)未经定义而直接赋值的变量自动被声明为拥有全局作用域
(3)所有window对象的属性拥有全局作用域

使用with语句关联了car对象,解析时 with代码块的内部把每个变量都认为是局部变量;如果局部变量里与car对象属性属性同名,这个局部变量就会指向car里面的属性;缺点1

var geval = eval; 
var x = 'global',y = 'global'; 
function f(){
var x = 'local';
eval('x += "changed";');
return x;
}
function g(){
var y = 'local';
geval('y += "changed";');
return y;
}
console.log(f(),x);//localchanged global
console.log(g(),y);//local globalchanged 

2、局部作用域(Local Scope)

  • with会自动在全局作用域创建一个全局变量,在严格模式下,会抛出ReferenceError 异常。
  • withwith 会在运行时修改或创建新的作用域,以此来欺骗其他在书写时定义的词法作用域。缺点2
  • with在相同条件下比不使用它慢了很多,具体的原因是因为js在运行之前要进行预编译,其中有些优化依赖于能够根据代码的词法进行静态分析,并预先确定所有变量和函数的定义位置,才能在执行过程中快速找到标识符。
  • 但如果引擎在代码中发现了 with,它只能简单地假设关于标识符位置的判断都是无效的,因为无法知道传递给 with 用来创建新词法作用域的对象的内容到底是什么。所以js就不会优化结语

  [注意]IE8-浏览器通过别名调用eval()和正常调用eval()的结果相同

局部作用域一般只能在固定的代码片段中才能访问,如函数内部的变量(函数作用域)

感谢您的观看,如有不足之处,欢迎批评指正。

副作用

var name = "xuxiaoping";
function echoName() {
 var firstname = "xu";//局部作用域
 secondname = "xiao";//全局作用域
 function echoFirstName() {
 console.log(first name);//xu
 }
 console.log(secondname);
 return echoFirstName;
}
console.log(name);//全局作用域

var f = echoName();
f();
console.log(firstname);
console.log(secondname);

  javascript解释器进行了大量的代码分析和优化。而eval()的问题在于,用于动态执行的代码通常不能分析,于是解释器也无法对其进行优化,这会导致性能下降

结果为:
xuxiaoping
xiao
xu//内层函数可以访问外层函数的变量
undenfined  //在函数外部无法访问函数的内部变量
xiao

  与eval()类似的有setTimeout()、setInterval()、new Function()等,这些函数都可以以字符串作为参数,在程序运行时动态执行。这种执行机制带来的好处无法抵消其性能上的损失,所以应该尽量避免使用

JavaScript将全局变量附加到了window对象上,成为了window对象的属性。

严格模式

3、函数作用域

  由于eval()函数过于强大,严格模式对其进行了严格的限制

块级作用域:任何一对花括号中的语句集都属于一个块,在这之中定义的所有变量在代码块外都是不可见的。大多数类C语言都是有块级作用域的。
然而JavaScript的有个重要的特点就是没有块级作用域。

本文由美高梅游戏网站登录发布于美高梅棋牌游戏,转载请注明出处:并返回字符串中的最后一个表达式或语句的值,

您可能还会对下面的文章感兴趣: