这样函数调用,该如何解释?

自由小菜园 2012-03-22 06:58:11

var foo = {
bar: function () {
alert(this);
}
};

1、foo.bar();//foo
2、(foo.bar)();//foo
3、(foo.bar = foo.bar)(); // global
4、foo.bar = foo.bar; foo.bar();//foo
6、(false || foo.bar)(); // global

...全文
345 40 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
40 条回复
切换为时间正序
请发表友善的回复…
发表回复
峭沙 2012-03-30
  • 打赏
  • 举报
回复
[Quote=引用 33 楼 的回复:]

引用 32 楼 axiheyhey 的回复:

我的理解是,js中小括号()有一个用法是(复杂表达式),这时的作用是取括号内的复杂表达式的最终结果为返回结果。也就是是(foo.bar = foo.bar)(3);等价于var func = (foo.bar = foo.bar); func(3); 此时this正好为window,(false || foo.bar)(5);同理

那你解……
[/Quote]第二个是简单表达式,亲。。
licai1210 2012-03-27
  • 打赏
  • 举报
回复
昨天看了下资料,这几个问题是网上找的吧,关系到引用类型、组合操作符、GetValue()方法,也就是前面LS说的一样,网上有很详细的解释,你可以找找。不过估计你也看了解释的
JParser 2012-03-26
  • 打赏
  • 举报
回复
请教一下那些建议去理解闭包的朋友,请你们用你们的闭包来分析一下这几个题
自由小菜园 2012-03-26
  • 打赏
  • 举报
回复
[Quote=引用 25 楼 licai1210 的回复:]

foo.bar=function(){
alert(this);
}();

foo.bar();
两个括号加的地方不同,导致了不同的结果,如果是这样,那答案就和执行方法的对象有关,那很容易理解了,本质上和(foo.bar=foo.bar)这个括号没关系,只和(foo.bar=foo.bar)()后面这个括号有关系了,也就是函数对象的调用者
[/Quote]
你这个理解怎么说呢……,有点偏
自由小菜园 2012-03-26
  • 打赏
  • 举报
回复
[Quote=引用 37 楼 licai1210 的回复:]

我继续说说我的看法,也一直在想这个问题,不知道这次偏不偏了。

那2和3说说吧

2中程序的支行可以说是从左往右的过程,所以此时一定有活动对象,也就是说this一定指向一个地方

但是3中处理了赋值操作,就相当于程序会从=号右边算起,这个时候的函数体是不是应该没有活动对象呢?如果没有的话this指向为underfine,但是实际上这个是没有什么意义的,那JS引擎就将这个this默认指……
[/Quote]
你这样的解释,也没从本质上来说明,什么叫“从左往右的过程,一定有活动对象,从又往左就没有活动对象了”,这样的说法你觉得合理吗?
licai1210 2012-03-26
  • 打赏
  • 举报
回复
我继续说说我的看法,也一直在想这个问题,不知道这次偏不偏了。

那2和3说说吧

2中程序的支行可以说是从左往右的过程,所以此时一定有活动对象,也就是说this一定指向一个地方

但是3中处理了赋值操作,就相当于程序会从=号右边算起,这个时候的函数体是不是应该没有活动对象呢?如果没有的话this指向为underfine,但是实际上这个是没有什么意义的,那JS引擎就将这个this默认指向window对象,这个是前规范的一个bug,现在5中好像已经修复了。

我也希望搞懂这个啊………………,不过这个解释现在不算偏吧,我觉得还合理
a597926661 2012-03-26
  • 打赏
  • 举报
回复
建议楼主学习一下闭包 这是JS进阶的必经之路 研究透了闭包 楼主的问题自然会迎刃而解
自由小菜园 2012-03-26
  • 打赏
  • 举报
回复
[Quote=引用 34 楼 sowuqing 的回复:]

我小小谈谈我的看法,表喷我啊,1,2,4都是调用的foo.bar方法,而3和6的括号里都是再判断真假,那么返回的应该不是foo对象吧,我觉得,所以3和6应该是一样的,括号里都返回的是true,而其他的都是foo的方法调用。不知道各位大侠,我说的对不对。
[/Quote]
你哪里看到3在判断真假了?
sowuqing 2012-03-26
  • 打赏
  • 举报
回复
[Quote=引用 34 楼 sowuqing 的回复:]

我小小谈谈我的看法,表喷我啊,1,2,4都是调用的foo.bar方法,而3和6的括号里都是再判断真假,那么返回的应该不是foo对象吧,我觉得,所以3和6应该是一样的,括号里都返回的是true,而其他的都是foo的方法调用。不知道各位大侠,我说的对不对。
[/Quote]
补充一下
(foo.bar)();应该相当于(function(){})();吧
而(false||foo.bar)相当于(true)();对吗?
sowuqing 2012-03-26
  • 打赏
  • 举报
回复
我小小谈谈我的看法,表喷我啊,1,2,4都是调用的foo.bar方法,而3和6的括号里都是再判断真假,那么返回的应该不是foo对象吧,我觉得,所以3和6应该是一样的,括号里都返回的是true,而其他的都是foo的方法调用。不知道各位大侠,我说的对不对。
自由小菜园 2012-03-26
  • 打赏
  • 举报
回复
[Quote=引用 32 楼 axiheyhey 的回复:]

我的理解是,js中小括号()有一个用法是(复杂表达式),这时的作用是取括号内的复杂表达式的最终结果为返回结果。也就是是(foo.bar = foo.bar)(3);等价于var func = (foo.bar = foo.bar); func(3); 此时this正好为window,(false || foo.bar)(5);同理
[/Quote]
那你解释第二个
峭沙 2012-03-26
  • 打赏
  • 举报
回复
我的理解是,js中小括号()有一个用法是(复杂表达式),这时的作用是取括号内的复杂表达式的最终结果为返回结果。也就是是(foo.bar = foo.bar)(3);等价于var func = (foo.bar = foo.bar); func(3); 此时this正好为window,(false || foo.bar)(5);同理
likeajin 2012-03-26
  • 打赏
  • 举报
回复
除了第二个,其他都好解释,如果把第二个改成
(test=foo.bar)();这个和第三个类似,至于(foo.bar)()为什么是foo,暂时想不通~~,莫非第一个()这种情况下不起作用???
自由小菜园 2012-03-26
  • 打赏
  • 举报
回复
[Quote=引用 29 楼 jparser 的回复:]

请教一下那些建议去理解闭包的朋友,请你们用你们的闭包来分析一下这几个题
[/Quote]
++
汉尼拔 2012-03-25
  • 打赏
  • 举报
回复
foo bar
licai1210 2012-03-25
  • 打赏
  • 举报
回复
foo.bar=function(){
alert(this);
}();

foo.bar();
两个括号加的地方不同,导致了不同的结果,如果是这样,那答案就和执行方法的对象有关,那很容易理解了,本质上和(foo.bar=foo.bar)这个括号没关系,只和(foo.bar=foo.bar)()后面这个括号有关系了,也就是函数对象的调用者
自由小菜园 2012-03-25
  • 打赏
  • 举报
回复
[Quote=引用 23 楼 licai1210 的回复:]

var foo = {
bar: function () {
alert(this);
}
};
foo.bar=function(){
alert(this)
}();
foo.bar();
这样写是错误的
这个我还不想通为什么是错误的,估计和你那问题关系很大
var foo = {
bar: function () {
alert……
[/Quote]
这个错误不是很简单啊,你因为执行了方法,所以最后你foo.bar其实等于undefined
litter_man 2012-03-23
  • 打赏
  • 举报
回复
函数返回值赋值给了:foo.bar?
自由小菜园 2012-03-23
  • 打赏
  • 举报
回复
说错了,5楼,唉,眼花了
自由小菜园 2012-03-23
  • 打赏
  • 举报
回复
解释这个还是得从内部原理剖析,其实6楼说到了一些重点,关键还有一个getValue这个内部的调用
加载更多回复(19)
作为Microsoft 32位平台的应用程序编程接口, Win32 API是从事Windows应用程序开发所必备的。 首先对Win32 API函数做完整的概述;然后收录五大类函数: 窗口管理、图形设备接口、系统服务、国际特性以及网络服务; 在附录部分,讲解如何在Visual Basic和Delphi中对其调用。 本书是从事Windows应用程序开发的软件工程师的必备参考手册。 控件与消息函数 共91个函数 硬件与系统函数 共98个函数 设备场景函数 共73个函数 绘图函数 共105个函数 位图、图标和光栅运算函数 共39个函数 菜单函数 共37个函数 文本和字体函数 共41个函数 打印函数 共66个函数 文件处理函数 共118个函数 进程和线程函数 共40个函数 Windows消息函数 共11个函数 网络函数 共14个函数 目 录 第一章 Win32 API概论…………………………………………………………………………1 1.1 为什么使用Win32 API …………………………………………………………………1 1.2 Win32 API简介 …………………………………………………………………………1 1.3 综述………………………………………………………………………………………11 第二章 窗口管理函数(Windows Control Function) ……………………………………13 2.1 易用特性函数(Accessibility Features)…………………………………………13 2.2 按钮函数(Button)……………………………………………………………………20 2.3 插入标记(^)函数(Caret)…………………………………………………………21 2.4 组合框函数(Combo box) ……………………………………………………………24 2.5 通用对话框函数(Common Dialog Box) ……………………………………………25 2.6 标函数(Cursor)………………………………………………………………………36 2.7 对话框函数(Dialog Box)……………………………………………………………40 2.8 编辑控制函数(Edit Control)………………………………………………………54 2.9 图标函数(Icon)………………………………………………………………………54 2.10 键盘加速器函数(Keyboard Accelerator)……………………………………… 61 2.11 键盘输入函数(Keyboard InPut) …………………………………………………63 2.12 列表框函数(List box) ……………………………………………………………75 2.13 菜单函数(Menu) ……………………………………………………………………76 2.14 消息和消息队列函数(Message and Message Queue)……………………………90 2.15 鼠标输入函数(Mouse Input) ……………………………………………………100 2.16 多文档接口函数(Multiple Document Interface) ……………………………103 2.17 资源函数(Resource)………………………………………………………………105 2.18 滚动条函数(Scroll Bar)…………………………………………………………113 2.19 窗口函数(Window)…………………………………………………………………119 2.20 窗口类函数(Window Class)………………………………………………………144 2.21 窗口过程函数(Window Procedure)………………………………………………150 2.22 窗口属性函数(Window Property) ………………………………………………152 第三章 图形设备接口函数(Graphic Device Interface Function) …………………155 3.1 位图函数(Bitmap) …………………………………………………………………155 3.2 笔刷函数(Brush)……………………………………………………………………171 3.3 剪切函数(Clipping) ………………………………………………………………176 3.4 颜色函数(Color)……………………………………………………………………179 3.5 坐标空间与变换函数(Coordinate Space Transformation)……………………186 3.6 设备环境函数(Device Context) …………………………………………………195 3.7 填充形态函数(Filled shape) ……………………………………………………211 3.8 字体和正文函数(Font and Text)…………………………………………………215 3.9 ICM 2.0函数 …………………………………………………………………………238 3.10 线段和曲线函数(Line and Curve)………………………………………………295 3.11 图元文件函数(Metafile)…………………………………………………………300 3.12 多显示器函数(Multiple Display Monitors) …………………………………311 3.13 绘图函数和画图函数(Painting and Drawing)…………………………………313 3.14 路径函数(Path)……………………………………………………………………328 3.15 画笔函数(Pen) ……………………………………………………………………332 3.16 打印及打印假脱机程序函数(Printing and Print Spooler)…………………334 3.17 矩形函数(Rectangle) ……………………………………………………………371 3.18 区域函数(Region)…………………………………………………………………374 第四章 系统服务函数(System Service Function) ……………………………………383 4.1 访问控制函数(Access Control) …………………………………………………383 4.2 原子函数(Atom) ……………………………………………………………………406 4.3 客户/服务器访问控制函数(Client/Server Access Control) ………………409 4.4 剪贴板函数(Clipboard)……………………………………………………………431 4.5 通信函数(Communication)…………………………………………………………436 4.6 控制台函数(Console)………………………………………………………………444 4.7 数据解压库函数(Data Decompression Library) ………………………………463 4.8 调试函数(Debugging)………………………………………………………………466 4.9 设备输入输出函数(Device Input and Output)…………………………………472 4.10 动态数据交换函数(Dynamic Data Exchange) …………………………………474 4.11 动态数据交换管理函数(Dynamic Data Exchange Management)………………476 4.12 动态链接库函数(Dynamic-Link Library)………………………………………489 4.13 错误函数(Error) …………………………………………………………………496 4.14 事件日志函数(Event Logging) …………………………………………………499 4.15 文件函数(File)……………………………………………………………………503 4.16 文件安装库函数(File Installation Library) ………………………………542 4.17 文件映射函数(File Mapping)……………………………………………………546 4.18 文件系统函数 File System)………………………………………………………551 4.19 句柄和对象函数(Handle and Object)………………………………………………556 4.20 挂钩函数(Hook)………………………………………………………………………560 4.21 ImageHlp函数…………………………………………………………………………572 4.22 大整数操作函数(Iarge Integer Operations)……………………………………594 4.23 低层访问控制函数(Low-Level Access Control)………………………………596 4.24 LSAPI函数 …………………………………………………………………………617 4.25 邮槽函数(Mailslot)………………………………………………………………622 4.26 内存管理函数(Memory Management) ……………………………………………623 4.27 管道函数(Pipe) …………………………………………………………………655 4.28 电源管理函数(Power Management) …………………………………………… 663 4.29 进程和线程函数(Process and Thread)…………………………………………666 4.30 注册表函数(Registry)……………………………………………………………700 4.31 字符串操作函数(String Manipulation)……………………………………… 724 4.32 结构化异常处理函数(Structured Exception Handling) ……………………742 4.33 同步函数(Synchronization) ……………………………………………………745 4.34 系统信息函数(System Information)……………………………………………766 4.35 系统消息函数(System Message)…………………………………………………780 4.36 系统关机函数(System Shutdown) ………………………………………………781 4.37 磁带备份函数(Tape Backup) ……………………………………………………783 4.38 时间函数(Time)……………………………………………………………………789 4.39 计时器函数(Timer) ………………………………………………………………795 4.40 工具帮助函数(Tool Help) ………………………………………………………796 4.41 窗口站和桌面函数(Window Station and Desktop)……………………………799 4.42 Windows NT 4.0访问控制函数(Window NT 4.0 Access-Control)……………808 4.43 WinTrust函数(WinTrust)…………………………………………………………814 第五章 国际特性函数(International Peatures Punction)时性…………………………815 5.1 输入方法编辑函数(Input Method Editor)…………………………………………815 5.2 国家语言支持函数(National Language Support)………………………………… 828 5.3 Unicode和字符集函数(Unicode and Character Set)……………………………… 843 第六章 网络服务函数(Networding Service Function)……………………………………849 6.1 数据链路控制函数(DLC)………………………………………………………………849 6.2 网络函数(Net)…………………………………………………………………………849 6.3 NetBIOS函数……………………………………………………………………………896 6.4 网络DDE函数(Networking DDE)……………………………………………………897 6.5 RAS服务器管理函数(RAS Server Administration)………………………………901 6.6 远程访问服务函数(Remote Access Administration)………………………………910 6.7 服务函数(Service)……………………………………………………………………929 6.8 Windows网络函数(Windows Networking)……………………………………………930 附录1 如何在VB中调用DLL API ……………………………………………………………945 1 DLL API的声明……………………………………………………………………………945 2 DLL API的调用……………………………………………………………………………947 附录2 在Delphi中直接调用Windows API…………………………………………………953

87,996

社区成员

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

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