js函数的两种写法:静态函数及非静态函数

本文介绍了JavaScript中两种函数的定义方式:静态化函数和需要初始化的函数。静态化函数可以直接调用,无需实例化;而需要初始化的函数则需要创建对象后才能调用。文章通过具体示例对比了这两种函数的实现方法。

1、js静态化函数,使用的时候不需要初始化。如下:

  var CheckFlash = {
            check: function() {
                var isIE = (navigator.appVersion.indexOf("MSIE") >= 0);
                var hasFlash = true;

                if (isIE) {
                    try {
                        var objFlash = new ActiveXObject("ShockwaveFlash.ShockwaveFlash");
                    } catch (e) {
                        hasFlash = false;
                    }
                } else {
                    if (!navigator.plugins["Shockwave Flash"]) {
                        hasFlash = false;
                    }
                }
                return hasFlash;
            }
         , prompt: function() {
             var flag = this.check();
             if (!flag) {
                 window.alert("本页面需要安装9.0以上的flash播放器后才能正常安装!");
             }
             else {
                 alert("Y");
             }
         }
     }

使用的时候直接调用即可:window.onload = CheckFlash.prompt();

2、需要初始化得写法

        var CheckFlash = function(){};
        CheckFlash.prototype={
            check: function() {
                var isIE = (navigator.appVersion.indexOf("MSIE") >= 0);
                var hasFlash = true;

                if (isIE) {
                    try {
                        var objFlash = new ActiveXObject("ShockwaveFlash.ShockwaveFlash");
                    } catch (e) {
                        hasFlash = false;
                    }
                } else {
                    if (!navigator.plugins["Shockwave Flash"]) {
                        hasFlash = false;
                    }
                }
                return hasFlash;
            }
         , prompt: function() {
             var flag = this.check();
             if (!flag) {
                 window.alert("本页面需要安装9.0以上的flash播放器后才能正常安装!");
             }
             else {
                 alert("Y");
             }
         }
     }
   调用方法: var c = new CheckFlash();
        c.prompt();
   两者的优点缺点暂时还不知

# 代码概述 在 Qt 5.9 中,`QObject::connect` 支持连接到**静态函数**,但由于静态函数(包括全局函数、类的静态成员函数)不属于 Qt 元对象系统(无 `slots` 标记),不能直接作为槽使用。必须通过 **lambda 表达式封装调用**来实现连接。 --- # 代码解析 ### ✅ 正确写法:使用 Lambda 封装静态函数调用 #### 示例 1:连接 `QSerialPort::readyRead` 到静态函数 ```cpp // 静态函数声明(可为全局或类内 static) static void handle_ready_read_static(SerialInternal* internal) { QByteArray data = internal->serial->readAll(); if (!data.isEmpty()) { ring_buffer_write(&internal->rx_buffer, reinterpret_cast<const uint8_t*>(data.data()), data.length()); } } // 在初始化中连接信号与静态函数 QObject::connect(internal->serial, &QSerialPort::readyRead, [internal]() { // 使用 lambda 捕获 internal handle_ready_read_static(internal); // 调用静态函数 }); ``` 📌 关键点: - `handle_ready_read_static` 是普通静态函数; - `[internal]()` 定义一个无返回值、无参数的 lambda; - 当 `readyRead` 触发时,执行该 lambda,进而调用静态函数。 --- #### 示例 2:静态成员函数 + Lambda 封装 ```cpp class SerialManager { public: static void onReadyRead(SerialInternal* internal); }; // 实现 void SerialManager::onReadyRead(SerialInternal* internal) { QByteArray data = internal->serial->readAll(); qDebug() << "Received:" << data; ring_buffer_write(&internal->rx_buffer, (const uint8_t*)data.data(), data.size()); } // 连接方式 QObject::connect(serial, &QSerialPort::readyRead, [internal]() { SerialManager::onReadyRead(internal); }); ``` ✅ 完全兼容 Qt 5.9,推荐用于模块化设计。 --- ### ❌ 错误写法(编译失败或不触发) ```cpp // ❌ 错误 1:直接传静态函数指针(类型不匹配) connect(serial, &QSerialPort::readyRead, &SerialManager::onReadyRead); // ❌ 错误 2:缺少捕获上下文 connect(serial, &QSerialPort::readyRead, []{ // 如果没有 internal 上下文,无法知道处理哪个串口 }); // ❌ 错误 3:试图使用 QueuedConnection 跨线程调用 lambda(不支持) // 若 serial 在子线程且未指定 DirectConnection,可能失效 ``` --- ### ✅ 推荐完整模式(带线程安全错误检查) ```cpp // 确保在 open 前连接 QObject::connect(internal->serial, &QSerialPort::readyRead, Qt::DirectConnection, // 显式指定直连,避免跨线程队列问题 [internal]() { if (internal->serial->bytesAvailable() > 0) { QByteArray data = internal->serial->readAll(); handle_ready_read_static(internal); // 调用静态处理函数 } }); // 最后打开串口 if (!internal->serial->open(QIODevice::ReadWrite)) { qDebug() << "Open failed:" << internal->serial->errorString(); } ``` --- # 知识点 ## 1. Lambda 封装静态函数 Qt 不支持将静态函数直接作为槽,需用 `[](){}` 包装调用,保持语法一致性。 ## 2. Qt::DirectConnection 必要性 当使用 lambda 捕获变量时,若跨线程默认走 `QueuedConnection` 会失败,应显式设为 `DirectConnection`。 ## 3. 捕获外部上下文 通过 `[internal]` 捕获指针或引用,使静态函数能访问运行时数据结构,实现 C++ 与 C 风格接口对接。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值