下面这个函数为何无法调用?
发布于 10 年前 作者 kingapple 3847 次浏览 最后一次编辑是 8 年前

x.test()调用为何会报错? y.test()却是没问题的?

var x=function(val){
	console.info('the value is: ', val);

	function len(val){
		if (typeof val=='undefined'){
			console.info('no source path specified')
		}
		console.info('nested len function called from ', val);
	}

	var test=function(){
		console.info('test');
	}
}

var y={
	test:function(){
		console.info('function defined in y');
	}
}

x('haha');
x('jindezhen');
console.info(typeof x.len);

y.test();

// x.test();
10 回复

@lonso x内部的test()在外部无法调用?只能在x内部调用? 相当于匿名函数?

y像个字典,不像函数,不过里面却有函数 x就是个函数,我想让它变得像字典,可是

没办法通过函数名称访问到内部的test变量,这是为啥?

这个不是函数对象内部的一个变量么?肿么就不能访问?

如果把function当成class,按其他语言的理解,test应该也是成员变量啊,

#咋就不能访问呢?

x函数里,test是局部变量,一旦出了x函数的作用域就没用了 y是个object,test是它的一个属性,这个属性对应的是一个函数,所以当然可以在外部调用

@amoa400 如果要让外部调用,使用属性比较好?

JavaScript和其他典型的面向对象的语言是不同的,不能按照其他语言的思路来理解JavaScript代码。楼主可以查下JavaScript变量作用域的资料来了解一下。

就这个问题来说,函数内部定义的变量只能在该函数内部使用,如果想在外部访问到的话,可以用return把它返回出去,这样在外部执行函数的时候就能得到这个变量的值了。

代码修改如下:

var x=function(val){
    console.info('the value is: ', val);
    function len(val){
        if (typeof val=='undefined'){
            console.info('no source path specified')
        }
    console.info('nested len function called from ', val);
    }
    var test=function(){
        console.info('test');
    }

    return test; //将内部变量传递出去
}

x('haha')(); //执行内部变量定义的函数

输出结果为: the value is: haha test

@wannianchuan 赶脚JS模拟OO很蛋疼。。

js中是用function来模拟class,看来不完全啊

class A{ var x; } A a a.x 可以访问的

但是 function A{ var x; } A a a,x是不能访问的。。。。

你可以这样理解, 你爸有个晚辈,这个晚辈是你,可以说有你爸就有你, 你爸有个晚辈,是村里老王的儿子,但是你不能说有你爸就有老王的儿子吧。

@xiuxu123 function定义类,内部变量不是其属性,只是定义域内的变量,无法从外部看到。 所以一个好的类,内部第一层必然是属性,第二层才是定义域变量:) 这样就可以从外部通过属性,直接使用类定义的函数:)

@amoa400 亲在看v8源码?小博客用的神马程序?

回到顶部