前端宝典【犀牛书】04(表达式计算)
一、eval()类似于局部作用域,作者个人理解是块级作用域
如果 在最 顶层 代码 中 调用 eval(), 当然, 它会作用于 全局 变量 和 全局 函数。
var foo = function( a){ eval( a); };
foo(" return; ");=>全局 上下 文中 使用 return 会 抛出 语法 错误: return not in function
var geval = eval; // 使用 别名 调用 eval 将是 全局 eval var x = "global", y = "global"; // 两个 全局 变量 function f() { // 函数 内 执 行的 是 局部 eval var x = "local"; // 定义 局部 变量 eval(" x += 'changed';"); // 直接 eval 更改 了局 部 变量 的 值 return x; // 返回 更改 后的 局部 变量 } function g() { // 这个 函数 内 执行 了 全局 eval var y = "local"; // 定义 局部 变量 geval(" y += 'changed';"); // 间接 调用 改变 了 全局 变量 的 值 return y; // 返回 未 更改 的 局部 变量 } console. log( f(), x); // 更改 了局 部 变量: 输出" localchanged global":
console. log( g(), y); // 更改 了 全局 变量: 输出" local globalchanged":
typeof运算符
返回操作数类型的字符串
delete运算符:删除对象的属性,,数组的值
删除 属性 或者 删除 数组 元素 不仅仅是 设置 了 一个 undefined 的 值。 当 删除 一个 属性 时, 这个 属性 将不 再 存在。 读取 一个 不存在 的 属性 将 返回 undefined, 但是 可以 通过 in 运算符( 见 4. 9. 3 节) 来 检测 这个 属性 是否 在 对象 中 存在。
delete 希望 他的 操作 数 是 一个 左 值, 如果 它 不是 左 值, 那么 delete 将不 进行 任何 操作 同时 或者不存在的属性(已经删除过的属性)返回 true。 否则, delete 将 试图 删除 这个 指 定的 左 值。 如果 删除 成功, delete 将 返回 true。 然而 并不是 所有 的 属性 都可 删除, 一些 内置 核心 和 客户 端 属性 是 不能 删除 的, 用户 通过 var 语句 声明 的 变量 不能 删除。 同样, 通过 function 语句 定义 的 函数 和 函数 参数 也不能 删除。
void运算符
忽略 计算 结果 并 返回 undefined。 由于 void 会 忽略 操 作数 的 值, 因此 在 操作 数 具有 副作用 的 时候 使用 void 来 让 程序 更具 语义。
< a href=" javascript: void window. open();"> 打开 一个 新 窗口</ a>
,运算符
总是 会计 算 左侧 的 表达式, 但 计算 结果 忽略 掉, 也就是说, 只有 左侧 表达式 具有 副作用, 才会 使用 逗号 运算符 让 代码 变得 更 通顺。 逗号 运算符 最 常用 的 场景 是在 for 循环 中( 见 5. 5. 3 节), 这个 for 循环 通常 具有 多个 循环 变量:
//for 循环 中的 第一个 逗号 是 var 语句 的 一部分 //第二个 逗号 是 逗号 运算符
//它将 两个 表达式( i++ 和 j--) 放在 一条( for 循环 中的) 语句 中
for( var i= 0, j= 10; i < j; i++, j--)
console. log( i+ j);