Javascript执行上下文和eval的困惑

yhfz2012 2015-01-03 11:48:40
最近在看犀牛书,读到eval章节,发现一件困惑的事情,书中代码:

var foo = function(a){
eval(a);
}
foo("return;");

上段代码执行会产生一个:return not in function 错误。因为eval(a);的上下文是全局的,而return只能在函数内使用。
但是:

var global = "global";
var foo = function(a){
eval(a);
}
foo("var global = 'local'");
alert(global);

以上代码输出是global
问题来了,eval执行上下文不是全局的吗?为什么输出不是local…我是不是有什么地方理解不对?
...全文
498 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
张运领 2015-01-03
  • 打赏
  • 举报
回复
是啊,偶尔会写点东西~~ 正好,刚才也在想一些东西,顺便就供你参考一下吧,几个示例,虽然不能很全面的说明上下文的东西,但是如果能想明白,应该有些帮助吧:
function getFunction(name){
	function getName(){
		return name;
	}
	return getName;
}

var a = getFunction("zhang"),
	b = getFunction("ling");
	
console.log(a == b);   //?
console.log(a());      //?
console.log(b());      //?
function bindFn(fn){
	return fn();
}

var name = "ling",
	obj = {
		name:"zhang",
		sayName:function(){
			return function(){
				return this.name;
			}
		}
	},
	sayName = obj.sayName;

console.log(obj.sayName()());    //?
console.log(sayName()());        //?
console.log(sayName.call(obj)());//?
	
var a = bindFn(obj.sayName),
	b = bindFn(sayName);
	
console.log(a()); //?
console.log(b()); //?
function bindFn(fn){
	return fn();
}

var name = "ling",
	obj = {
		name:"zhang",
		sayName:function(){
			var name = this.name;
			return function(){
				return name;
			}
		}
	},
	sayName = obj.sayName;

console.log(obj.sayName()());    //?
console.log(sayName()());        //?
console.log(sayName.call(obj)());//?
	
var a = bindFn(obj.sayName),
	b = bindFn(sayName);
	
console.log(a());  //?
console.log(b());  //?
只想了这么一点点,所以,有兴趣,可以试着看看~~
yhfz2012 2015-01-03
  • 打赏
  • 举报
回复
话说那是你博客
yhfz2012 2015-01-03
  • 打赏
  • 举报
回复
引用 3 楼 zyl_lyr1019 的回复:
var foo = function(a){
    eval(a);
}
foo("var a = function(){return 2;}();alert(a);");
//return是关键字,只能出现在function的内容部,
//而eval传入的是一个字符串,如果你想要在eval传入的字符串中使用return,那么就必须有一个一个函数的字符串的形式,我这么理解。

foo("alert(this)");
//而且eval也没有什么上下文的概念吧?既然说到上下文,那么就要访问到eval的内部this属性,可是,eval的内部this,可以访问到吗?

//或者说,像eval,alert,这些都是定义在window对象下的顶级函数,它们内部的this指向(也就是上下文),和定义在哪,是没有关系的,只和你怎么使用有关。

//所以,这样定义一下,能理解吗?
var b = {foo : foo};
b.foo("alert(this)");


//或者,使用自定义的方法:

function aa(){
	alert(this);
}

//这里的this,就是指向window的
aa();
var bb = {
	aa:aa
};

bb.aa();
//这里的this就是指向bb对象的。

之前有总结过一点关于this指向东西,仅供参考: 函数中this的指向-简单认识
似乎有点明白了灰常感谢。。好多年没来感觉csdn好冷清……
张运领 2015-01-03
  • 打赏
  • 举报
回复
var foo = function(a){
    eval(a);
}
foo("var a = function(){return 2;}();alert(a);");
//return是关键字,只能出现在function的内容部,
//而eval传入的是一个字符串,如果你想要在eval传入的字符串中使用return,那么就必须有一个一个函数的字符串的形式,我这么理解。

foo("alert(this)");
//而且eval也没有什么上下文的概念吧?既然说到上下文,那么就要访问到eval的内部this属性,可是,eval的内部this,可以访问到吗?

//或者说,像eval,alert,这些都是定义在window对象下的顶级函数,它们内部的this指向(也就是上下文),和定义在哪,是没有关系的,只和你怎么使用有关。

//所以,这样定义一下,能理解吗?
var b = {foo : foo};
b.foo("alert(this)");


//或者,使用自定义的方法:

function aa(){
	alert(this);
}

//这里的this,就是指向window的
aa();
var bb = {
	aa:aa
};

bb.aa();
//这里的this就是指向bb对象的。

之前有总结过一点关于this指向东西,仅供参考: 函数中this的指向-简单认识
yhfz2012 2015-01-03
  • 打赏
  • 举报
回复
引用 1 楼 zyl_lyr1019 的回复:
var global = "global";
var foo = function(a){
    eval(a);
}
foo("global = 'local'");
//不要添加var ,在函数内部使用var定义,就呗定义成局部变量了。
alert(global);
不是这个意思,eval的上下文是什么。var 变量名在函数内就是局部的,如果这么理解,那eval执行return为什么又报错。
张运领 2015-01-03
  • 打赏
  • 举报
回复
var global = "global";
var foo = function(a){
    eval(a);
}
foo("global = 'local'");
//不要添加var ,在函数内部使用var定义,就呗定义成局部变量了。
alert(global);

87,907

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧