Javascript中有关函数的问题

看js高级程序设计, 里面提到函数的内部属性有两个, argument 和 this. 后一节又说函数的属性是length 和 prototype.

  1. 我之前学过Java, C++, 基本上对象的属性不就是对象的属性吗? 还有内部和外部之分?

  2. 而且我发现我在函数内部若想使用argument, 是不用functionName.argument这种方式的, 直接argument就行了, 另外就算是functionName.argument也没错, 也可以完成引用. 但是对于函数的属性例如lengthprototype, 就必须使用functionName.argument, 这又是为什么呢? 求大神解答.

阅读 2.6k
2 个回答

对象的属性不就是对象的属性吗? 还有内部和外部之分?

没有外部与内部属性之分,你说的arguments与this算是某种特性,它们都有各自的作用。

arguments最早的确是一个函数的属性Function.arguments,现在标准早就弃用了,已经是独立的arguments默认对象,在函数中的块级作用域中会自动产生。

this也并非是对象的属性,它是类似你学过的Java, C++里面的this概念,是一种语言中参照(refer)的设计,但实际上它在JS中的功用会与Java, C++有些不同,要理解它需要进一步理解更多资讯。

我不清楚为何JS高级程序设计要这么说,所以我研究了一下这本书中你说的章节。

下面是原文与中译本的截图,你可以比对一下,我认为这是中译的标题有误,造成你的误解。"Function Internals"指的应该是函数的"内部构成"或"内部结构"等等,而中译本中用了"属性"会联想到"对象的属性"是误解。指对象属性的英文应该是"Properties"。

图片描述

而且我发现我在函数内部若想使用argument, 是不用functionName.argument这种方式的, 直接argument就行了, 另外就算是functionName.argument也没错, 也可以完成引用. 但是对于函数的属性例如length 和 prototype, 就必须使用functionName.argument, 这又是为什么呢?

Function.arguments可以用是因为最早以前有一个Function.arguments,后来改了直接用arguments。现在还可以用是因为浏览器保留了下来这种用法。浏览器原本就会保留早期的一些用法,不见得后来改了标准,就一定得去除掉旧的用法,只是现在没人这样用而已,arguments有特殊的作用,把它是个独立的对象来用会比较恰当。其它的属性的用法,就一般的对象属性的取成员的用法。函数原本就算是对象,自然就这样用。

另外,arguments是后面有加s的英文专用字词,它是代表复数的值的对象。你用单数的argument是用不了的。

argument和this相当于在当前函数环境中帮你完成了注入,是由浏览器提供的,这两个变量属性允许你直接使用。
另外functionName.arguments这种方式早已不推荐使用,已从标准中移除。由标准的变化也可以看出,这些东西都是在以方便使用来的,理解的话就理解为this和arguments都是用来获取当前函数内的这两个属性的值的,所以就可以直接使用了吧。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题