js如何让对象中的函数可以互相调用

图片说明
图片说明这个是console.log出来的东西,我在代码中加了(d_manager.events.chek[]0.handler)(),不管用,估计我想多了,不知道如何才能调用它
图片说明
这个是console.log(d_manager)的结构,我不清楚这些定义好的函数是不是在events下面
请问有更好的办法吗?请各路大神支招呀

3个回答

知道函数的作用域或扩展空间就可以调用了

qq_34439125
别来无恙`` 可以说的详细点吗??急呀谢谢了
3 年多之前 回复

作用域问题,你可以断点看你的值是多少

最好的方法就是设置断点,调试以下js执行顺序和规则。

qq_34439125
别来无恙`` 请问断点咋弄呢?
3 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
js中函数外面定义的对象,在函数里面不能调用

![图片说明](https://img-ask.csdn.net/upload/201701/04/1483508526_445786.jpg) 图片是我的代码截图,函数外面定义的对象,在函数里面为什么不能调用。但是,把定义的函数,剪切到函数里面就没问题,求大神指点

JS中封装对象里的事件函数调用内部函数不执行 请高手指点

imgDbClick: function(){ clearTimeout(clickTimeId); var tb = this.getElementsByClassName('thumbnail')[0]; var imginfo=imgManger.getImgInfo(tb,4)//这是成功代码 特别感谢qq37744644 原来用的是this.getImgInfo 报错 但是在对象内别的方法调用正常 除了单双击事件里(就封装了这2个事件函数) imgedit(imginfo); }, init: function(){ var self = this; var imgObjs = document.getElementsByClassName(cn); for (var i = 0; i < imgObjs.length; i++) { imgObjs[i].ondblclick = self.imgDbClick; imgObjs[i].onclick = self.imgClick; imgObjs[i].onmouseenter = self.imgHover; imgObjs[i].onmouseleave = self.imgOut; }; }, setImgObj: function(imginfo){ var tb=this.getImgObj(imginfo[0]); if(!tb){alert('Object not find!');return false;} var imgobj=tb.childNodes[1]; var caption = tb.getElementsByClassName('caption')[0]; imgobj.src=imginfo[2]; caption.childNodes[1].innerText=imginfo[3]; caption.childNodes[3].innerText=imginfo[1]; caption.childNodes[5].innerText=imginfo[4]; return true; },

关于临时对象调用成员函数的问题

各位老师,初学c++,看到《c++ primer》(第五版)第247页时,有一段话说:“当成员函数返回一个类时,返回类型不是引用,则返回值是*this的副本,因此调用成员函数只能改变临时副本。” 这里不太理解,既然临时对象是右值,右值不能通过地址访问,那调用句点运算符就不能传地址给this,为什么右值对象也能调用成员函数呢?请教各位老师。

如何实现子函数的互相调用?

学习51 准备写用数码管显示做计算器 程序中有子函数互相调用 扫描一个时报错另一个![图片说明](https://img-ask.csdn.net/upload/201912/01/1575207891_260139.png) ``` uchar KeyPro() { uint key_v; switch(KeyScan()) { case 0xee: key_v=0; break; case 0xde: key_v=1; break; case 0xbe: key_v=2; break; case 0x7e: key_v=3; break; case 0xed: key_v=4; break; case 0xdd: key_v=5; break; case 0xbd: key_v=6; break; case 0x7d: key_v=7; break; case 0xeb: key_v=8; break; case 0xdb: key_v=9; break; case 0x7b: break; case 0xe7: num=add(shi_1,ge_1); break; case 0xd7: num=sub(shi_1,ge_1); break; case 0xb7: num=mul(shi_1,ge_1); break; case 0x77: num=div(shi_1,ge_1); break; } return key_v; } /***********************************************************************/ /*加法*/ /*//////////////////////////////*/ int add(uint shi_1,uint ge_1) { if(flag==3)flag=0; while(1) { led1=0; switch(flag) { case 1: shi_2=KeyPro(); break; case 2: ge_2=KeyPro(); break; }if(flag==2) break; } shu1=shi_1*10+ge_1; shu2=shi_2*10+ge_2; shu=shu1+shu2; z++; return (shu); } /*减法*/ /*//////////////////////////////////////////////////////*/ int sub(uint shi_1,uint ge_1) { if(flag==3)flag=0; while(1) { led2=0; switch(flag) { case 1: shi_2=KeyPro(); break; case 2: ge_2=KeyPro(); break; }if(flag==2) break; } shu1=shi_1*10+ge_1; shu2=shi_2*10+ge_2; shu=shu1-shu2; z++; return (shu); } /*乘法*/ /*////////////////////////////////////////////////////*/ int mul(uint shi_1,uint ge_1) { if(flag==3)flag=0; while(1) { led3=0; switch(flag) { case 1: shi_2=KeyPro(); break; case 2: ge_2=KeyPro(); break; }if(flag==2) break; } shu1=shi_1*10+ge_1; shu2=shi_2*10+ge_2; shu=shu1*shu2; z++; return (shu); } /*除法*/ /*////////////////////////////////////////////////////*/ int div(uint shi_1,uint ge_1) { if(flag==3)flag=0; while(1) { led4=0; switch(flag) { case 1: shi_2=KeyPro(); break; case 2: ge_2=KeyPro(); break; }if(flag==4) break; } shu1=shi_1*10+ge_1; shu2=shi_2*10+ge_2; shu=shu1/shu2; z++; return (shu); } ```

JavaScript中函数的调用需要放在函数定义的后边吗

想问问大神们JavaScript中函数的调用的位置需要放在函数定义位置的后边吗?

js怎么调用函数中的值

能帮忙指点下这代码应该怎么改,怎么没有结果啊,我就是想在函数中赋值,然后输出调用 ``` <!DOCTYPE html> <html> <body> <h2>JavaScript 函数</h2> <p>本例调用函数把华氏度转换为摄氏度:</p> <p id="gwp1"></p> <script> function () { var gwp=60; var gwp1=gwp+10; document.getElementById("gwp1").innerHTML =gwp1, }, </script> </body> </html> ```

内联函数中可以调用其他函数么

比如: inline void FuncA(_T para) { FuncB(para, para+1); } void FuncB(_T paraA, _T paraB) { //Something } 我试了下是可以通过编译的,函数运行也正常。 我想知道在编译时,FuncA调用的地方直接使用一句“ FuncB(para, para+1); ”进行替换, 还是说整个FuncB也会被展开塞进代码里?或者说对于这种情况编译器不会生成内联函数?

类对象做函数参数,结束后,调用析构函数么

类对象作为函数参数,当函数结束时,作为参数的类对象撤销么?是否调用析构函数。

Vue全局函数无法在钩子函数里调用

#在钩子函数中无法调用全局函数,但是却能在方法中调用。这是什么情况??? 钩子函数中调用出错 ![图片说明](https://img-ask.csdn.net/upload/201907/19/1563531345_932352.png) 错误代码 ![图片说明](https://img-ask.csdn.net/upload/201907/19/1563531663_523603.png) ![图片说明](https://img-ask.csdn.net/upload/201907/19/1563531361_266883.png) 函数声明 ![图片说明](https://img-ask.csdn.net/upload/201907/19/1563531370_942815.png)

c语言函数指针为什么可以调用main函数,同除main函数之外的调用有什么不同之处

# include<stdio.h>//这是调用代码 调用使用函数指针调用main函数 效果是一个递归 int (*f)(void); void put_s(char* s); int main(void) { char a[8]; f = main;//将main函数地址赋值给F指针函数 put_s(a); puts(a); putchar(f()); getchar(); return 0; } void put_s(char* s) { gets(s); return; }

请问如何调用对象中的函数

这里有个集合,请问集合里面可以有函数吗?像下面这样 ``` html: <input id="name" value=""> jsp: aa = { change:function() { $("#name").value = '已发送'; } } ``` 请问可以这样写吗?如果这样写是对的,那么请问该如何调用这个函数呢?当我用aa.change()或者aa.change的时候,查看错误信息是“undefined”。请各位老师知道一些。

js的对象/函数初始化流程,什么时候调用构造器,怎么赋值,

在线等,先让这张图解释出来 用WORD文档 ,采用图文分析 ![图片](https://img-ask.csdn.net/upload/201703/10/1489117371_557017.jpg)

在js函数中使用php并在php中调用函数参数

![图片说明](https://img-ask.csdn.net/upload/201905/07/1557192311_942881.png) 如图,我想在php中使用js函数的参数e,怎么才能使用啊?

javascript字面量创建对象的方法有没有调用Object构造函数?

如下: ``` var o1 = { name : 'programmer', age : 25 }; var o2 = new Object(); o2.name = 'programmer'; o2.age = 25; ``` o2在创建时调用了Object构造函数,因为使用了new关键字,但是o1的创建是否也掉用了Object构造函数?如果字面量方式的创建没有调用Object构造函数,那么它创建对象的原理是什么? 另外,“表达式上下文”即expression context是什么意思?

js内父级函数调用子函数出现函数未定义问题

首先定义了一个全局函数Locating,又在Locating内定义了一个局部函数pageScroll,然后我全局函数调用pageScroll时,报错Uncaught ReferenceError: pageScroll is not defined。 ``` function Locating(locate,time){ console.log(locate+' -- '+time); var div_locate=document.getElementById(locate); var window_top_y = document.body.scrollTop;//获取滚动条顶部距离页面顶部的距离 var element_top_y = div_locate.offsetTop;//获取某元素顶部距离页面顶部的距离 var distance = window_top_y-element_top_y;//当前窗口与顶部的距离 var time = time; var move_distance = time>50?Math.ceil((distance/Math.ceil(time/50))):distance;//每次移动的距离 //每次移动的位移应为distance/duration,要移动的位置为element_top_y, function pageScroll() { var top = document.body.scrollTop;//获取滚动条顶部距离页面顶部的距离 var dis_top = top - element_top_y; window.scrollBy(0,-move_distance); scrolldelay=setTimeout('pageScroll()',50); if(dis_top<=0){ clearTimeout(scrolldelay); } // console.log(dis_top); } pageScroll(); } ``` 请问除了将pageScroll定义为全局的函数,各位前辈还有哪些其他解决方法可以借鉴学习一下的

关于C++中对象作为返回值时候的调用复制构造函数

#include <iostream> using namespace std; class A { public: int v; A(int n){v = n;} A(const A &a) { v = a.v; cout << "Copy constructor called" << endl; } }; A Func() { /* A *b = new A(43); return *b; */ A b(54); return b; } int main() { cout << Func().v << endl; return 0; } 注释了的那部分可以成功调用,但是直接定义的一个对象不能调用复制构造函数。这是为什么呢?

JavaScript设计一个外部调用的函数

### 设计一个可以在外部调用的方法,方法中有回调函数,且回调函数能获取到需要的值 现在有一个编辑器插件(自已封装的),编辑器上有一个保存的按钮,当点击此按钮,会执行一个方法,这个方法中有回调函数,回调函数的参数为编辑器中的文本内容。我应该怎么做? ```javascript // 编辑器内容的方法 var editorPlugns = { saveBackFn: null; }; editor.save = function() { // 保存编辑器自己要做的业务处理 } // 在外部的回调方法,即外面需要做的事情 editorPlugns.saveBackFn = function(data) { console.log(data); // 此处为回调函数返回过来的编辑器中的文本内容 } ``` 编辑器只是作了一个文本编辑的作用,但是由于里面的功能也蛮多的,又不想影响插拔式使用,所以思路是想把具体要做用编辑器的模块上做具体的业务,而编辑器只是作为编辑的界面功能,不做任何业务上的处理。

c#调用html文件中js函数

要做一个程序从读卡器读出数据,给的测试的网页中可以用读卡器读出数据,怎么才能用c#调用html中的js函数 html> ``` <head> <title>TEST</title> <script language="javascript"> function GetCardinfo() { var cport; var cseat; var str1; cport=parseInt(document.form1.T1.value); cseat=parseInt(document.form1.T2.value); str1=document.getElementById("CIccardCtrl").GetCardinfo(cport,cseat); document.form1.cardinfo.value=str1; } </script> </head> <body> <OBJECT classid=clsid:8A5B3626-40FC-4563-AF78-C9C4AC2ECFD6 width=0 height=0 align="center" id="CIccardCtrl" HSPACE=0 VSPACE=0> </OBJECT> <form name="form1"> <p>串口号<input type="text" name="T1" size="20" value="1"> <p>卡座号(1:下卡座 2:上卡座)<input type="text" name="T2" size="20" value="1"> <p><input type="text" name="cardinfo" size="60"> <input type="button" onclick="javascript:GetCardinfo()" value="读卡信息" > </form> </body> </html> ```

求教:js对象中的函数 访问变量的问题

name = "global"; var obj = { name:"obj", fun:function(){ alert(name); } }; obj.fun(); 结果是global,我觉得应该是obj才对,求解答

大学四年自学走来,这些私藏的实用工具/学习网站我贡献出来了

大学四年,看课本是不可能一直看课本的了,对于学习,特别是自学,善于搜索网上的一些资源来辅助,还是非常有必要的,下面我就把这几年私藏的各种资源,网站贡献出来给你们。主要有:电子书搜索、实用工具、在线视频学习网站、非视频学习网站、软件下载、面试/求职必备网站。 注意:文中提到的所有资源,文末我都给你整理好了,你们只管拿去,如果觉得不错,转发、分享就是最大的支持了。 一、电子书搜索 对于大部分程序员...

在中国程序员是青春饭吗?

今年,我也32了 ,为了不给大家误导,咨询了猎头、圈内好友,以及年过35岁的几位老程序员……舍了老脸去揭人家伤疤……希望能给大家以帮助,记得帮我点赞哦。 目录: 你以为的人生 一次又一次的伤害 猎头界的真相 如何应对互联网行业的「中年危机」 一、你以为的人生 刚入行时,拿着傲人的工资,想着好好干,以为我们的人生是这样的: 等真到了那一天,你会发现,你的人生很可能是这样的: ...

程序员请照顾好自己,周末病魔差点一套带走我。

程序员在一个周末的时间,得了重病,差点当场去世,还好及时挽救回来了。

ArrayList源码分析(入门篇)

ArrayList源码分析 前言: 写这篇博客的主要原因是,在我上一次参加千牵科技Java实习生面试时,有被面试官问到ArrayList为什么查找的速度较快,插入和删除的速度较慢?当时我回答得不好,很大的一部分原因是因为我没有阅读过ArrayList源码,虽然最后收到Offer了,但我拒绝了,打算寒假学得再深入些再广泛些,下学期开学后再去投递其他更好的公司。为了更加深入理解ArrayList,也为

我以为我学懂了数据结构,直到看了这个导图才发现,我错了

数据结构与算法思维导图

String s = new String(" a ") 到底产生几个对象?

老生常谈的一个梗,到2020了还在争论,你们一天天的,哎哎哎,我不是针对你一个,我是说在座的各位都是人才! 上图红色的这3个箭头,对于通过new产生一个字符串(”宜春”)时,会先去常量池中查找是否已经有了”宜春”对象,如果没有则在常量池中创建一个此字符串对象,然后堆中再创建一个常量池中此”宜春”对象的拷贝对象。 也就是说准确答案是产生了一个或两个对象,如果常量池中原来没有 ”宜春” ,就是两个。...

技术大佬:我去,你写的 switch 语句也太老土了吧

昨天早上通过远程的方式 review 了两名新来同事的代码,大部分代码都写得很漂亮,严谨的同时注释也很到位,这令我非常满意。但当我看到他们当中有一个人写的 switch 语句时,还是忍不住破口大骂:“我擦,小王,你丫写的 switch 语句也太老土了吧!” 来看看小王写的代码吧,看完不要骂我装逼啊。 private static String createPlayer(PlayerTypes p...

和黑客斗争的 6 天!

互联网公司工作,很难避免不和黑客们打交道,我呆过的两家互联网公司,几乎每月每天每分钟都有黑客在公司网站上扫描。有的是寻找 Sql 注入的缺口,有的是寻找线上服务器可能存在的漏洞,大部分都...

讲一个程序员如何副业月赚三万的真实故事

loonggg读完需要3分钟速读仅需 1 分钟大家好,我是你们的校长。我之前讲过,这年头,只要肯动脑,肯行动,程序员凭借自己的技术,赚钱的方式还是有很多种的。仅仅靠在公司出卖自己的劳动时...

上班一个月,后悔当初着急入职的选择了

最近有个老铁,告诉我说,上班一个月,后悔当初着急入职现在公司了。他之前在美图做手机研发,今年美图那边今年也有一波组织优化调整,他是其中一个,在协商离职后,当时捉急找工作上班,因为有房贷供着,不能没有收入来源。所以匆忙选了一家公司,实际上是一个大型外包公司,主要派遣给其他手机厂商做外包项目。**当时承诺待遇还不错,所以就立马入职去上班了。但是后面入职后,发现薪酬待遇这块并不是HR所说那样,那个HR自...

女程序员,为什么比男程序员少???

昨天看到一档综艺节目,讨论了两个话题:(1)中国学生的数学成绩,平均下来看,会比国外好?为什么?(2)男生的数学成绩,平均下来看,会比女生好?为什么?同时,我又联想到了一个技术圈经常讨...

副业收入是我做程序媛的3倍,工作外的B面人生是怎样的?

提到“程序员”,多数人脑海里首先想到的大约是:为人木讷、薪水超高、工作枯燥…… 然而,当离开工作岗位,撕去层层标签,脱下“程序员”这身外套,有的人生动又有趣,马上展现出了完全不同的A/B面人生! 不论是简单的爱好,还是正经的副业,他们都干得同样出色。偶尔,还能和程序员的特质结合,产生奇妙的“化学反应”。 @Charlotte:平日素颜示人,周末美妆博主 大家都以为程序媛也个个不修边幅,但我们也许...

MySQL数据库面试题(2020最新版)

文章目录数据库基础知识为什么要使用数据库什么是SQL?什么是MySQL?数据库三大范式是什么mysql有关权限的表都有哪几个MySQL的binlog有有几种录入格式?分别有什么区别?数据类型mysql有哪些数据类型引擎MySQL存储引擎MyISAM与InnoDB区别MyISAM索引与InnoDB索引的区别?InnoDB引擎的4大特性存储引擎选择索引什么是索引?索引有哪些优缺点?索引使用场景(重点)...

如果你是老板,你会不会踢了这样的员工?

有个好朋友ZS,是技术总监,昨天问我:“有一个老下属,跟了我很多年,做事勤勤恳恳,主动性也很好。但随着公司的发展,他的进步速度,跟不上团队的步伐了,有点...

我入职阿里后,才知道原来简历这么写

私下里,有不少读者问我:“二哥,如何才能写出一份专业的技术简历呢?我总感觉自己写的简历太烂了,所以投了无数份,都石沉大海了。”说实话,我自己好多年没有写过简历了,但我认识的一个同行,他在阿里,给我说了一些他当年写简历的方法论,我感觉太牛逼了,实在是忍不住,就分享了出来,希望能够帮助到你。 01、简历的本质 作为简历的撰写者,你必须要搞清楚一点,简历的本质是什么,它就是为了来销售你的价值主张的。往深...

玩转springboot启动banner定义所得

最近接手了一个springboot项目,不是不熟悉这个框架,启动时打印的信息吸引了我。 这不是我熟悉的常用springboot的打印信息啊,我打开自己的项目: 还真是的,不用默认的感觉也挺高大上的。一时兴起,就去研究了一下源代码,还正是有些收获,稍后我会总结一下。正常情况下做为一个老程序员,是不会对这种小儿科感兴趣的,不就是一个控制台打印嘛。哈哈! 于是出于最初的好奇,研究了项目的源代码。看到

带了6个月的徒弟当了面试官,而身为高级工程师的我天天修Bug......

即将毕业的应届毕业生一枚,现在只拿到了两家offer,但最近听到一些消息,其中一个offer,我这个组据说客户很少,很有可能整组被裁掉。 想问大家: 如果我刚入职这个组就被裁了怎么办呢? 大家都是什么时候知道自己要被裁了的? 面试软技能指导: BQ/Project/Resume 试听内容: 除了刷题,还有哪些技能是拿到offer不可或缺的要素 如何提升面试软实力:简历, 行为面试,沟通能...

离职半年了,老东家又发 offer,回不回?

有小伙伴问松哥这个问题,他在上海某公司,在离职了几个月后,前公司的领导联系到他,希望他能够返聘回去,他很纠结要不要回去? 俗话说好马不吃回头草,但是这个小伙伴既然感到纠结了,我觉得至少说明了两个问题:1.曾经的公司还不错;2.现在的日子也不是很如意。否则应该就不会纠结了。 老实说,松哥之前也有过类似的经历,今天就来和小伙伴们聊聊回头草到底吃不吃。 首先一个基本观点,就是离职了也没必要和老东家弄的苦...

男生更看重女生的身材脸蛋,还是思想?

往往,我们看不进去大段大段的逻辑。深刻的哲理,往往短而精悍,一阵见血。问:产品经理挺漂亮的,有点心动,但不知道合不合得来。男生更看重女生的身材脸蛋,还是...

为什么程序员做外包会被瞧不起?

二哥,有个事想询问下您的意见,您觉得应届生值得去外包吗?公司虽然挺大的,中xx,但待遇感觉挺低,马上要报到,挺纠结的。

当HR压你价,说你只值7K,你该怎么回答?

当HR压你价,说你只值7K时,你可以流畅地回答,记住,是流畅,不能犹豫。 礼貌地说:“7K是吗?了解了。嗯~其实我对贵司的面试官印象很好。只不过,现在我的手头上已经有一份11K的offer。来面试,主要也是自己对贵司挺有兴趣的,所以过来看看……”(未完) 这段话主要是陪HR互诈的同时,从公司兴趣,公司职员印象上,都给予对方正面的肯定,既能提升HR的好感度,又能让谈判气氛融洽,为后面的发挥留足空间。...

面试:第十六章:Java中级开发(16k)

HashMap底层实现原理,红黑树,B+树,B树的结构原理 Spring的AOP和IOC是什么?它们常见的使用场景有哪些?Spring事务,事务的属性,传播行为,数据库隔离级别 Spring和SpringMVC,MyBatis以及SpringBoot的注解分别有哪些?SpringMVC的工作原理,SpringBoot框架的优点,MyBatis框架的优点 SpringCould组件有哪些,他们...

面试阿里p7,被按在地上摩擦,鬼知道我经历了什么?

面试阿里p7被问到的问题(当时我只知道第一个):@Conditional是做什么的?@Conditional多个条件是什么逻辑关系?条件判断在什么时候执...

终于懂了TCP和UDP协议区别

终于懂了TCP和UDP协议区别

你打算用Java 8一辈子都不打算升级到Java 14,真香

我们程序员应该抱着尝鲜、猎奇的心态,否则就容易固步自封,技术停滞不前。

无代码时代来临,程序员如何保住饭碗?

编程语言层出不穷,从最初的机器语言到如今2500种以上的高级语言,程序员们大呼“学到头秃”。程序员一边面临编程语言不断推陈出新,一边面临由于许多代码已存在,程序员编写新应用程序时存在重复“搬砖”的现象。 无代码/低代码编程应运而生。无代码/低代码是一种创建应用的方法,它可以让开发者使用最少的编码知识来快速开发应用程序。开发者通过图形界面中,可视化建模来组装和配置应用程序。这样一来,开发者直...

面试了一个 31 岁程序员,让我有所触动,30岁以上的程序员该何去何从?

最近面试了一个31岁8年经验的程序猿,让我有点感慨,大龄程序猿该何去何从。

大三实习生,字节跳动面经分享,已拿Offer

说实话,自己的算法,我一个不会,太难了吧

程序员垃圾简历长什么样?

已经连续五年参加大厂校招、社招的技术面试工作,简历看的不下于万份 这篇文章会用实例告诉你,什么是差的程序员简历! 疫情快要结束了,各个公司也都开始春招了,作为即将红遍大江南北的新晋UP主,那当然要为小伙伴们做点事(手动狗头)。 就在公众号里公开征简历,义务帮大家看,并一一点评。《启舰:春招在即,义务帮大家看看简历吧》 一石激起千层浪,三天收到两百多封简历。 花光了两个星期的所有空闲时...

《经典算法案例》01-08:如何使用质数设计扫雷(Minesweeper)游戏

我们都玩过Windows操作系统中的经典游戏扫雷(Minesweeper),如果把质数当作一颗雷,那么,表格中红色的数字哪些是雷(质数)?您能找出多少个呢?文中用列表的方式罗列了10000以内的自然数、质数(素数),6的倍数等,方便大家观察质数的分布规律及特性,以便对算法求解有指导意义。另外,判断质数是初学算法,理解算法重要性的一个非常好的案例。

立即提问
相关内容推荐