详解new function(){}和function(){}()

本文探讨了JavaScript中使用new关键字调用构造函数时不同返回值的影响,包括返回对象引用与原始类型的区别,并通过示例代码说明这些概念。

情景一:

var yx01 = new function() {return "圆心"};
alert
(yx01);

我们运行情景一代码,将返回显示“[object object] ”,此时该代码等价于:

function 匿名类(){
       
return "圆心";
}
var yx01 = new 匿名类();
alert
(yx01);

我们对情景一的代码进行下面改造:

var yx01 = new function() {return new String("圆心")};
alert
(yx01);

我们运行,将会发现返回的是“圆心”,这是为什么呢?

只要 new 表达式之后的 constructor 返回(return)一个引用对象(数组,对象,函数等),都将覆盖new创建的匿名对象,如果返回(return)一个原始类型(无 return 时其实为 return 原始类型 undefined),那么就返回 new 创建的匿名对象。(谢谢 Lunatic_Sun ,描述更精准点)

由于 new String 会构造一个对象,而不是一个 string 直接量,且new String(x) 如果带参数,那么alert它的时候就会返回 x。所以 yx01 将返回 new String(”圆心”) 这个对象,而 alert yx01 则显示 “圆心”。

情景二:

var yx02 = function() {return "圆心"}();
alert
(yx02);

我们运行情景二代码,将返回显示“圆心”,此时该代码等价于:

var 匿名函数 = function() {return "圆心"};
yx02
= 匿名函数();
alert
(yx02);

很明显,yx02 返回的是匿名函数的执行结果值,即 yx02 为:“圆心”。

当然匿名函数的执行结果也可以为一个匿名对象。具体常见应用可以看《Javascript的一种模块模式》

<think>好的,我现在需要详细解释Elasticsearch的function_score查询。首先,我得回顾一下自己对这个功能的理解。function_score查询主要用于自定义评分,允许用户修改查询返回文档的相关性评分,或者根据特定条件过滤文档后重新计算评分。这对于个性化搜索排名非常有用,比如根据销量、热度、时间等因素调整搜索结果排序。 接下来,我应该分步骤来组织解释。首先,介绍function_score的基本概念作用。然后,讲解它的组成部分,比如查询、函数、评分模式、权重等。需要详细说明每个可用的函数类型,如weight、field_value_factor、random_score、衰减函数(gauss、linear、exp)以及script_score。每个函数的作用参数都要举例说明,比如field_value_factor使用哪个字段,如何影响评分。 然后,需要讨论function_score的参数,比如boost、boost_mode、score_mode、max_boost等。这些参数控制如何将多个函数的评分合并,以及最终评分的计算方式。例如,score_mode决定各个函数评分如何组合(相加、相乘、平均等),boost_mode决定函数评分如何与原始评分结合。 接下来,应该给出一些实际应用的例子,比如电商中的商品排序,新闻文章按时间衰减等。这些例子能帮助用户理解如何组合不同的函数参数来实现具体的业务需求。例如,结合field_value_factor提升销量高的商品,使用gauss函数让新发布的内容排名靠前。 同时,需要注意可能遇到的常见问题,比如评分归一化的问题,避免不同函数导致的评分范围差异过大。此外,还要提到性能方面的考虑,使用脚本评分可能会影响查询速度,需要合理使用缓存优化脚本。 需要检查是否有遗漏的重要点,比如过滤器与评分的结合,如何在不影响评分的情况下过滤文档。可能还需要解释衰减函数的参数配置,比如origin、scale、offset、decay等,以及它们对评分曲线的影响。 最后,总结function_score的使用场景最佳实践,帮助用户合理选择函数参数配置,以达到理想的搜索排序效果。确保语言通俗易懂,结构清晰,步骤分明,方便用户理解并应用到实际项目中。</think>Elasticsearch的`function_score`查询是用于干预搜索结果相关性评分的核心功能。以下为详细解析(全文遵循LaTeX格式规范): --- ### 一、基础概念 `function_score`允许对原始查询的评分进行二次加工,通过$$评分函数$$动态调整文档排名。适用于: 1. 提升热门商品权重($field\_value\_factor$) 2. 时间衰减效果($gauss/exp/linear$) 3. 随机排序($random\_score$) 4. 自定义脚本评分($script\_score$) --- ### 二、核心结构 ```json { "query": { "function_score": { "query": {}, // 原始查询 "functions": [], // 函数列表 "score_mode": "", // 函数间评分组合方式 "boost_mode": "", // 最终评分组合方式 "max_boost": 100 // 评分上限 } } } ``` --- ### 三、评分函数详解 #### 1. weight函数(固定加权) ```json { "weight": 2, "filter": { "term": { "category": "电子产品" } } } ``` - 效果:匹配过滤器的文档评分$ \times 2$ #### 2. field_value_factor(字段值加权) ```json { "field_value_factor": { "field": "sales", "factor": 1.2, "modifier": "sqrt", "missing": 1 } } ``` - 计算公式:$$ new\_score = old\_score \times \sqrt{(factor \times sales)} $$ #### 3. 衰减函数(距离衰减) ```json { "gauss": { "publish_date": { "origin": "now", "scale": "10d", "offset": "3d", "decay": 0.5 } } } ``` - 衰减曲线:距离`origin`越远评分越低 - 参数关系:$$ offset + scale \rightarrow 衰减到decay值 $$ #### 4. random_score(随机排序) ```json { "random_score": { "seed": 10, "field": "_seq_no" } } ``` - 相同seed值生成确定性随机数 #### 5. script_score(自定义脚本) ```json { "script_score": { "script": { "source": """ double price = doc['price'].value; return _score * Math.log(price); """ } } ``` - 支持Painless脚本动态计算评分 --- ### 四、组合控制参数 | 参数 | 作用 | 可选值 | |-------------|--------------------------------------------------------------------|---------------------------------| | score_mode | 多个函数的评分组合方式 | sum, avg, max, min, multiply | | boost_mode | 最终评分与原始评分的组合方式 | replace, multiply, sum, avg... | | max_boost | 函数评分上限(避免评分爆炸) | 默认FLT_MAX | --- ### 五、实战案例 电商商品搜索排序需求: - 基础匹配:商品名称包含"手机" - 提升权重:品牌为"Apple"的权重$\times 3$ - 销量因子:$$ score = score \times \log(1 + sales) $$ - 时间衰减:3天内发布的商品优先 对应DSL: ```json { "query": { "function_score": { "query": { "match": { "name": "手机" } }, "functions": [ { "filter": { "term": { "brand": "Apple" } }, "weight": 3 }, { "field_value_factor": { "field": "sales", "modifier": "ln1p" } }, { "gauss": { "publish_date": { "origin": "now", "scale": "3d", "offset": "1d" } } } ], "score_mode": "sum", "boost_mode": "multiply" } } } ``` --- ### 六、注意事项 1. 性能影响:脚本评分复杂函数会增加CPU开销 2. 评分归一化:建议通过`normalization`控制评分范围 3. 结果验证:使用`explain=true`查看评分计算细节 通过合理组合函数,可实现符合业务需求的精细化排序效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值